2017-08-25 5 views
1

そう...EFコアモデル構築の規則

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)); 
    } 
} 

このアプローチは、デフォルトの文字列の長さ/ nullでを設定するために使用できるようにモデル構築の際にプロパティの型に基づいて規則を定義することが可能でしたネスなど。

EFコアモデルと関連タイプを調べましたが、マイグレーションビルダによって制定された方法で同等の規則を適用する方法が見つからないか、またはマイグレーションビルダーがモデルを完全に拒否することはありません。これは完全にイライラしており、後退しているようです。追加OnModelCreatingイベントに次の

更新

...

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(); 
} 

は...これは仕事をしていません

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

はあなただけ(https://stackoverflow.com/questions/41468722/loop-reflect-through- [ループ/列タイプを設定するために、すべてのEFモデル内のすべてのプロパティを使用して反映]のバリエーションを使用することはできませんすべてのプロパティですべてのefモデルから列の型に変換する/ 41469383#41469383) –

+0

@IvanStoevはこれを試しました - レンダリングされる移行には影響しません。 – Matt

+0

私のテストでは、マイグレーションジェネレータによって考慮されています。現在、AFAIK(2.0でも)の方法はありません。あなた/誰かが何かを見つけたら面白いでしょう。がんばろう。 –

答えて

0

アドオンの移行に次のメッセージを生成ししかし、それはかなり控えめです。

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()"); 
} 
関連する問題