2

データレイヤーでリポジトリを使用すると、エンティティを更新するために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
            }
        }

    }

ありがとう。

4

2 に答える 2

1

エンティティビルダーで

modelBuilder.Entity<T>()
            .HasKey(o => new { key1, key2});

key1key2は複合キーです。

于 2021-05-10T12:03:30.730 に答える