3

私はドメイン モデルを作成中で、「Id」プロパティ (およびその他の監査追跡機能) を持つ「BaseEntity」クラスを作成したいと考えています。Id プロパティは主キーであり、ドメイン モデルの各エンティティは BaseEntity クラスから継承されます。かなり簡単なもの.....

public class BaseEntity
{
    [Key]
    public int Id { get; set; }

    public DateTime LastUpdate { get; set; }
    public string LastUpdateBy { get; set; }
}
public class Location : BaseEntity
{
    [Required]
    public string Name { get; set; }

    public string Description { get; set; }
}

上記の例を使用して、「Id」フィールドを「LocationId」列にマップしたいと思います。次のようにして、各エンティティに対して明示的にこれを行うために modelBuilder を使用できることを理解しています。

modelBuilder.Entity<Location>().Property(s => s.Id).HasColumnName("LocationId");

しかし、ドメイン モデル内のすべてのエンティティに対してこれを実行したいのですが、それは見苦しくなります。

次のちょっとした反省を試みましたが、運がありませんでした。何らかの理由で、コンパイラは「シンボル タイプを解決できません」:

foreach (var type in GetTypesInNamespace(Assembly.Load("Domain.Model"),"Domain.Model"))
{
    modelBuilder.Entity<type>().Property(x=>x.Id).....
}

データベースの「Id」プロパティを「ClassNameId」プロパティにマップするために、デフォルトの PrimaryKey 規則をオーバーライドする規則を定義する方法はありますか? Entity Framework 6 を使用しています。

4

5 に答える 5

1

DbContext クラスでこれを試してください。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Properties<int>()
      .Where(p => p.Name.Equals("Id"))
      .Configure(c => c.HasColumnName(c.ClrPropertyInfo.ReflectedType.Name + "Id"));
}

int は、主キー フィールドの CLR タイプです。コード内のすべてのキーを Id として参照したいのですが、DBA はキーをテーブル エンティティ名プレフィックス付きの Id にする必要があります。上記は、作成したデータベースに必要なものを正確に提供します。

Entity Framework 6.x が必要です。

于 2014-04-14T17:35:09.593 に答える
0

カスタム規則を使用しない場合の動的アプローチの開始

 modelBuilder.Entity<Location>().Property(s => s.Id).HasColumnName("LocationId");

これは、コンテキストのリフレクションを使用して行うことができます。説明としての擬似コード:

Reflect Context to get a list of POCO names
For each POCO in a dbcontext.
Map Property Id -> string PocoName+Id

このタイプのソリューションに使用する拡張機能を次に示します。

    // DBSet Types is the Generic Types POCO name  used for a DBSet
    public static List<string> GetModelTypes(this DbContext context) {
        var propList = context.GetType().GetProperties();
        return GetDbSetTypes(propList);
    }

    // DBSet Types POCO types as IEnumerable List
    public static IEnumerable<Type> GetDbSetPropertyList<T>() where T : DbContext {
        return typeof (T).GetProperties().Where(p => p.PropertyType.GetTypeInfo()
                                                      .Name.StartsWith("DbSet"))
                         .Select(propertyInfo => propertyInfo.PropertyType.GetGenericArguments()[0]).ToList();
    }


   private static List<string> GetDbSetTypes(IEnumerable<PropertyInfo> propList) {
        var modelTypeNames = propList.Where(p => p.PropertyType.GetTypeInfo().Name.StartsWith("DbSet"))
                                     .Select(p => p.PropertyType.GenericTypeArguments[0].Name)
                                     .ToList();
        return modelTypeNames;
    }

    private static List<string> GetDbSetNames(IEnumerable<PropertyInfo> propList) {
        var modelNames = propList.Where(p => p.PropertyType.GetTypeInfo().Name.StartsWith("DbSet"))
                                 .Select(p => p.Name)
                                 .ToList();

        return modelNames;
    }

ただし、終了するには動的ラムダを使用する必要があります。ここでそのトピックを続けてください: EF シナリオを使用した動的ラムダの例

EDIT : EntityTypeConfiguration<T> を使用する場合の一般的な BAse Config クラス アプローチの抽象ドメイン モデル基本クラスに対処する別の質問へのリンクを追加します。

于 2013-05-07T23:44:35.027 に答える