2017-08-25 4 views
1

In EF6 war es möglich, Konventionen zu definieren, basierend auf Immobilienarten während Modellbau, wie so ...EF Kern Modellbau Konventionen

public interface IEntity 
{ 
    Guid Id { get; } 
} 

public class MyEntity : IEntity 
{ 
    public Guid Id { get; set; } 
} 

public class MyDbContext : DbContext 
{ 
    public override void OnModelCreating(DbModelBuilder builder) 
    { 
     builder 
      .Properties<Guid>() 
      .Where(x => x.Name == nameof(IEntity.Id) 
      .Configure(a=>a.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)); 
    } 
} 

Dieser Ansatz auch Standard-String-Länge eingestellt werden könnte/Null- und so weiter.

Ich habe das EF-Core-Modell und die zugehörigen Typen durchgesehen und finde keine Möglichkeit, eine äquivalente Konvention auf eine Weise anzuwenden, die entweder vom Migrations-Builder ausgeführt wird oder nicht dazu führt, dass migration builder das Modell komplett ablehnt. Das ist völlig frustrierend und wirkt regressiv.

aktualisieren

Hinzufügen der folgenden zum OnModelCreating Ereignis ...

foreach (var pb in builder.Model 
    .GetEntityTypes() 
    .Where(x=>typeof(IEntity).IsAssignableFrom(x.ClrType)) 
    .SelectMany(t => t.GetProperties()) 
    .Where(p => p.ClrType == typeof(Guid) && p.Name == nameof(IEntity.Id)) 
    .Select(p => builder.Entity(p.DeclaringEntityType.ClrType).Property(p.Name))) 
{ 
    pb.UseSqlServerIdentityColumn(); 
} 

... erzeugt die folgende Meldung auf Add-Migration

Identity value generation cannot be used for the property 'Id' on entity type 'Tenant' because the property type is 'Guid'. Identity value generation can only be used with signed integer properties. 
+0

Können Sie sich nicht eine Variation von [Loop/reflektieren über alle Eigenschaften in allen EF-Modelle Spaltentyp einstellen] verwenden (https://stackoverflow.com/questions/41468722/loop-reflect-through- all-properties-in-all-ef-models-to-set-spalten-type/41469383 # 41469383)? –

+0

@IvanStoev hat dies versucht - hat keine Auswirkungen auf die Migration, die gerendert wird. – Matt

+0

In meinen Tests wird dies vom Migrationsgenerator berücksichtigt. Und es gibt derzeit keinen anderen Weg (auch in 2.0) AFAIK. Aber wäre es interessant wenn du/jemand etwas findest. Viel Glück. –

Antwort

0

Dies macht den Job aber es ist ziemlich unelegant.

foreach (PropertyBuilder pb in builder.Model 
    .GetEntityTypes() 
    .Where(x=>typeof(IEntity).IsAssignableFrom(x.ClrType)) 
    .SelectMany(t => t.GetProperties()) 
    .Where(p => p.ClrType == typeof(Guid) && p.Name == nameof(IEntity.Id)) 
    .Select(p => builder.Entity(p.DeclaringEntityType.ClrType).Property(p.Name))) 
{ 
    pb.ValueGeneratedOnAdd().HasDefaultValueSql("newsequentialid()"); 
} 
Verwandte Themen