0

次の DB スキーマと POCO クラスがあります。

Table ClassA
[ID] int NOT NULL

Table DPV
[ClassName] nvarchar(max) NOT NULL
[ObjectID] int NOT NULL
[Name] nvarchar(max) NOT NULL
[Value] nvarchar(max) NULL


public class ClassA
{
   public int ID { get; set; }
   public Dictionary<string, string> AssociatedDPVs { get; set; }
}

上記のスキーマを POCO にマップしてClassA、DB コンテキストからロードすると、次のClassA.AssociatedDPVsように入力されるようにすることは可能ですか?

DPVs.Where(d => d.ClassName == "ClassA" && d.ObjectID == this.ID)
    .ToDictionary(d => d.Name, d => d.Value)
4

1 に答える 1

2

それをマッピングすることはできません。EF はデータベースのリレーションをマップすることしかできませんが、おそらく回避策 (未テスト - 単なるアイデア) で実現できます。

擬似コード:

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
objectContext.ObjectMaterialized += (sender, e) => {
    var context = sender as ObjectContext; 
    var entity = e.Entity as ClassA;
    if (entity != null) {
       entity.AssociatedDPVs = context.CreateObjectSet<DPV>()
                                      .Where(d => d.ClassName == "ClassA" && d.ObjectID == entity.ID)
                                      .ToDictionary(d => d.Name, d => d.Value);
    }
};

これにより、DPV を取得する際の問題が解決されるはずです。DPV も保持する必要がある場合は、オーバーライドSaveChangesしてDbContext、どの DPV を追加、変更、または削除する必要があるかを EF に通知する必要があります (したがって、この情報が必要であり、通知さNameValueません)。

于 2012-08-30T09:12:39.743 に答える