データレイヤーでリポジトリを使用すると、エンティティを更新するために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
}
}
問題は、複合主キーでこのメソッドを使用する方法です。つまり、主キーが 2 つ以上の列で構成されている場合です。
更新: 私の問題は Find() メソッドにあります。たとえば、2 つの変数を複合 PK として渡すと、attachedEntity が null になり、例外が発生します:「同じキーを持つオブジェクトが 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
}
}
}
ありがとう。