2013-03-14 5 views
8

私はthisの記事を読んだことがありますが、それでも重要なことを誤解しています。電話をする必要はありませんエンティティフレームワークでの保存

_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(); 
} 
+1

毎回 '[... = EntityState.Modifyed]'を呼び出す必要はありません。 – MarcinJuraszek

答えて

4

あなたは尋ねる:

は、我々はすべてのUPDATE/DELETE/...操作で _context.SaveChanges() を呼び出す必要はありませんか。

いいえわからない。 Deleteを呼び出すと、エンティティを実際に削除しないでください。マークを削除してください。

同じことをUpdateとしますが、エンティティに変更を加えるために他の操作を行う必要はありません。デフォルトのテンプレートによって生成されたすべてのプロパティはINotifyPropertyChangedを実装するので、エンティティがいつ修正されるかを知ることができます。

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

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); 

は、その後、あなたはエンティティた場合、その変更は、ローカル・トランザクション

EDIT

にデータベースに永続化されますAddedDeletedまたはModifiedの状態を持っているすべてのentites SaveChanges呼び出します削除のマークが付けられていて、それを変更しようとすると、InvalidOperationException

+0

Repository.GetAll()を呼び出す必要があります。SaveChanges()は変更を送信します。 – NET

+1

はい、あなたは 'Savechanges'を呼び出すことができる必要があります。絶対に。私はあなたがまだ削除のためにマークされた項目を照会することができると思うが、助言はしないだろう - エンティティが 'Deleted'から' Modified'に行くことはできないと私は考えています –

+1

私は自分の答えを更新しました。削除のマークが付いたエンティティを変更しようとすると、例外が発生します。 –

2

あなたは、メモリ内のコンテキストに多くの変更を行うことができ、 挿入、更新などおよび削除:

は、ここに私のコードです。 SaveCahnges()を呼び出すと、すべての変更はDB内の単一トランザクションで に保存されます。 これはすべてが提出されたことを意味し、エラーの場合は のいずれも提出されません。

+0

IRepositoryにSaveChangesメソッドを実装する必要がありますか? – NET

+0

リポジトリクラスでコンテキストをラップする理由がわかりません。コンテキストを直接操作することができます。例えばcontext.Cars.AddObject(new Car())など... –

関連する問題