我在数据层中使用了一个存储库,其中包含 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 传递给它时,附加实体为空,我得到异常:“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
}
}
}
谢谢。