【发布时间】:2021-05-11 13:00:22
【问题描述】:
我在数据层使用了一个存储库,其中包含 chrisb 建议的更新实体的以下方法,代码在更新之前首先访问主键:
var entry = _dbContext.Entry<T>(entity);
// Retreive the Id through reflection
var pkey = _dbset.Create().GetType().GetProperty("Id").GetValue(entity);
if (entry.State == EntityState.Detached)
{
var set = _dbContext.Set<T>();
T attachedEntity = set.Find(pkey); // You need to have access to key
if (attachedEntity != null)
{
var attachedEntry = _dbContext.Entry(attachedEntity);
attachedEntry.CurrentValues.SetValues(entity);
}
else
{
entry.State = EntityState.Modified; // This should attach entity
}
}
问题是如何将此方法与复合主键一起使用:即当主键由两列或多列组成时。
更新:我的问题在于 Find() 方法,例如,当我将两个变量作为复合 PK 传递给它时,attachEntity 为空,我得到了异常: “ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。”
update2:这里是修改后的完整方法代码
public virtual void Update(T entity, params Object[] pkey)
{
var entry = _dbContext.Entry<T>(entity);
if (entry.State == EntityState.Detached)
{
var set = _dbContext.Set<T>();
T attachedEntity = set.Find(pkey); // You need to have access to key
if (attachedEntity != null)
{
var attachedEntry = _dbContext.Entry(attachedEntity);
attachedEntry.CurrentValues.SetValues(entity);
}
else
{
entry.State = EntityState.Modified; // This should attach entity
}
}
}
谢谢。
【问题讨论】:
-
你能告诉我们你将 2 个变量传递给 Find() 的新代码吗?
-
好的,我去掉了反射语句,将变量作为参数传递给包含代码的方法,所以调用该方法的代码将主键部分的名称传递给它。这是一种解决方法,但它对我可用,因为我从 WCF 服务层调用此方法。
-
刚刚在您发表评论的同时将该技术添加到我的帐户中!现在可以用了吗?
-
我得到与上面相同的异常,并且附加实体为空。对于信息,我使用数据库优先方法和 EF 从数据库创建实体数据模型
-
能贴出代码吗?
标签: entity-framework