9

私はこの記事を読みましたが、いまだに重要な瞬間を誤解しています。私たちは電話する必要はありません

_context.SaveChanges()

すべての削除/更新/... 操作で?

エンティティのプロパティを変更すると、SaveChanges()結果がデータベースに送信されますか、それとも手動で設定する必要がありますEntityState.Modifyedか?

これが私のコードです:

public class Repository<T> : IRepository<T> 
    where T : class
{
    private IDbContext _context;

    public Repository(IDbContext context)
    {
        _context = context;
    }

    private IDbSet<T> DbSet
    {
        get
        {
            return _context.Set<T>();
        }
    }

    #region IRepository<T> Members

    public void Insert(T entity)
    {
        DbSet.Add(entity);
    }

    public void Delete(T entity)
    {
        DbSet.Remove(entity);
    }

    public IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate)
    {
        return DbSet.Where(predicate);
    }

    public IQueryable<T> GetAll()
    {
        return DbSet;
    }

    public T GetById(int id)
    {
        return DbSet.Find(id);
    }
    #endregion
}

public interface IDbContext
{
    IDbSet<T> Set<T>() where T : class;

    int SaveChanges();
    void Dispose();
}
4

2 に答える 2

4

あなたが尋ねる:

すべての削除/更新/... 操作で _context.SaveChanges() を呼び出す必要はありませんか?

いいえ、ありません。呼び出し時 Deleteにエンティティを実際に削除するのではなく、削除のマークを付けます。

と同じことUpdateですが、エンティティに必要な変更を加えるために他に何もする必要はありません。すべてのプロパティ (既定のテンプレートによって生成される) が実装されるINotifyPropertyChangedため、エンティティがいつ変更されるかがわかります。

すべてのエンティティ (最初にデータベース内 - defullt テンプレートによって自動生成) にはStateプロパティがあります。このプロパティはObjectContext、変更が ObjectEntity のスコープ内で発生する限り、 によって維持されます。

例えば

Customer c;
using(var context = new MyEntityContext())
{
  c = context.Customer.FirstOrDefault(); //state is now Unchanged
  c.Name = "new name"; // this set the State to Modified
 //context.SaveChanges(); // will persist the data to the store, and set the State back to unchaged
}

//if we look at our customer outside the scope of our context
//it's State will be Detacth
Console.WriteLine(c.State);

次に、ローカル トランザクションで、状態がデータベースに保持されているか、保持さSaveChangesれるすべてのエンティティを呼び出します。Added DeletedModified

編集

エンティティが削除対象としてマークされていて、それを変更しようとすると、InvalidOperationException

于 2013-03-14T08:15:08.593 に答える
2

挿入、更新、削除など、メモリ内コンテキストで多くの変更を実行できます。SaveCahnges() を呼び出すと、行ったすべての変更が単一のトランザクションで DB に保存されます。これは、それらがすべて送信されるか、エラーの場合はいずれも送信されないことを意味します。

于 2013-03-14T07:47:28.813 に答える