这几个列和一个字典之间的映射是否可行?

时间:2012-08-30 08:58:27

标签: c# entity-framework ef-code-first

我有以下DB Schema和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,以便在从DB上下文加载ClassA时,ClassA.AssociatedDPVs将填充类似于此:

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

1 个答案:

答案 0 :(得分: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并告知EF应添加,修改或删除哪些DPV(因此您必须拥有此信息并且只需NameValue不会告诉你)。