我会尽量明确:
我的目标:阅读我在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>
任何人都可以指出我正确的方向吗?
感谢。
答案 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
只会更新标量和复杂属性。它无法帮助您更新导航属性。您必须使用非通用代码来更新特定于每个实体类型的关系。