4

汎用リポジトリに次の更新メソッドがあります

public class Repository<T> : IRepository<T> where T : class
{
    private readonly DbSet<T> _dbSet;
    public virtual T Update(T item) {
        return _dbSet.Attach(item);
    }
}

には、コンテキストUnitOfWorkで を呼び出す commit メソッドがあります。SaveChanges詳細はこちら
https://codereview.stackexchange.com/questions/19037/entity-framework-generic-repository-pattern

エンティティを更新してから呼び出すとき

ProductRepository.Update(modifiedProduct);
UnitOfWork.Commit;

データベースには何も浮かびません。

ただし、Commit を呼び出すだけで機能します (update メソッドの呼び出しはありません)。

では、変更がデータベースに流れない原因となるアタッチ メソッドは何をしているのでしょうか。アタッチ呼び出しは、更新メソッドで行う正しい呼び出しだと思います。それで、予期しない動作の原因は何ですか。

CodePlex の EF ソース コードから

/// <summary>
///     Attaches the given entity to the context underlying the set.  That is, the entity is placed
///     into the context in the Unchanged state, just as if it had been read from the database.
/// </summary>
/// <param name="entity"> The entity to attach. </param>
/// <returns> The entity. </returns>
/// <remarks>
///     Attach is used to repopulate a context with an entity that is known to already exist in the database.
///     SaveChanges will therefore not attempt to insert an attached entity into the database because
///     it is assumed to already be there.
///     Note that entities that are already in the context in some other state will have their state set
///     to Unchanged.  Attach is a no-op if the entity is already in the context in the Unchanged state.
/// </remarks>
public object Attach(object entity)
{
    Check.NotNull(entity, "entity");

    InternalSet.Attach(entity);
    return entity;
}
4

2 に答える 2

5
///     Attach is used to repopulate a context with an entity that is known to already exist in the database.
///     SaveChanges will therefore not attempt to insert an attached entity into the database because
///     it is assumed to already be there.
///     Note that entities that are already in the context in some other state will have their state set
///     to Unchanged. 

エンティティをアタッチした後、状態は Unchanged になるため、そのエンティティに対して UPDATE SQL は起動しません。アタッチ後にエンティティの状態を手動で設定する必要があります。

于 2012-12-19T09:33:17.663 に答える
4

オブジェクトをデータベースにアタッチするmodifiedadded、データベースへのクエリを生成する必要があります。

  public virtual T AttachAsModified(T item) {
        item = _dbSet.Attach(item);
        db.Entry(item).State = System.Data.EntityState.Modified
        return item;
    }
于 2012-12-19T09:34:14.207 に答える