EF代码优先:模型配置

时间:2011-10-18 10:15:34

标签: c# .net entity-framework-4.1 ef-code-first

我会尽量明确:

我的目标:阅读我在OnModelCreating派生的实体类中覆盖的DbContext中声明的模型配置。

原因:要在我的数据层上构建通用void Update<T>(T toUpdate)方法,我在其中获取哪些字段是T的主键,在传递的toUpdate对象上检索它们并在{{Set<T>().Find中使用它们1}}方法。

这将允许我不为我处理的每种类型的实体硬编码查找逻辑。

我需要检索存储的实体以应用更新,如下所示:

var retrievedItem = _entities.Set<T>().Find(myRetrievedKeyValues);
_entities.Entry(retrievedItem).CurrentValues.SetValues(toUpdate);

我坚持认为在我的_entities实例中(当然是我的实体类派生自DbContext)我似乎无法找到模型配置的存储位置。< / p>

任何人都可以指出我正确的方向吗?

感谢。

1 个答案:

答案 0 :(得分:1)

您可以在此处找到如何检索实体类型YourEntity的关键属性名称的代码:

Entity Framework code first. Find primary key

然后检索值:

public Update<T>(T toUpdate)
{
    // Code from link above with YourEntity = T

    List<object> myRetrievedKeyValues = new List<object>();
    foreach (var keyName in keyNames)
        myRetrievedKeyValues.Add(toUpdate.GetType().GetProperty(keyName)
            .GetValue(toUpdate, null));

    var retrievedItem = _entities.Set<T>().Find(myRetrievedKeyValues.ToArray());
    _entities.Entry(retrievedItem).CurrentValues.SetValues(toUpdate);
}

预计您将使用非常慢的Update方法,因为您必须对此通用方法使用反射。

另外请不要忘记CurrentValues.SetValues只会更新标量和复杂属性。它无法帮助您更新导航属性。您必须使用非通用代码来更新特定于每个实体类型的关系。