注: Entity Frameworkバージョン5を使用しています
汎用リポジトリ内には、次のようにAdd
、Edit
およびDelete
メソッドがあります。
public class EntityRepository<T> : IEntityRepository<T>
where T : class, IEntity, new() {
readonly DbContext _entitiesContext;
public EntityRepository(DbContext entitiesContext) {
if (entitiesContext == null) {
throw new ArgumentNullException("entitiesContext");
}
_entitiesContext = entitiesContext;
}
//...
public virtual void Add(T entity) {
DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity);
if (dbEntityEntry.State != EntityState.Detached) {
dbEntityEntry.State = EntityState.Added;
}
else {
_entitiesContext.Set<T>().Add(entity);
}
}
public virtual void Edit(T entity) {
DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity);
if (dbEntityEntry.State == EntityState.Detached) {
_entitiesContext.Set<T>().Attach(entity);
}
dbEntityEntry.State = EntityState.Modified;
}
public virtual void Delete(T entity) {
DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity);
if (dbEntityEntry.State != EntityState.Detached) {
dbEntityEntry.State = EntityState.Deleted;
}
else {
DbSet dbSet = _entitiesContext.Set<T>();
dbSet.Attach(entity);
dbSet.Remove(entity);
}
}
}
これらの方法が適切に実装されているかどうかを考えますか?特にAdd
メソッド。以下のようにAdd
メソッドを実装する方が良いでしょうか?
public virtual void Add(T entity) {
DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity);
if (dbEntityEntry.State == EntityState.Detached) {
_entitiesContext.Set<T>().Attach(entity);
}
dbEntityEntry.State = EntityState.Added;
}
追加の場合:
_public bool Add<E>(E entity) where E : class
{
DataContext.Entry(entity).State = System.Data.EntityState.Added;
Save();
}
_
更新の場合:
_ public bool Update<E>(E entity) where E : class
{
DataContext.Entry(entity).State = System.Data.EntityState.Modified;
Save();
}
_
削除の場合:
_ public bool Delete<E>(E entity) where E : class
{
DataContext.Entry(entity).State = System.Data.EntityState.Deleted;
Save();
}
_
Trueまたはfalseを返すプライベートSave()
メソッド。結果に応じてコントローラーで簡単にフォールバックできます。
_private bool Save()
{
return DataContext.SaveChanges() > 0;
}
_
これは私の汎用リポジトリの一部にすぎません。エンタープライズアプリケーションで最適に機能します。
更新:
分離は、メソッドに渡される特定のオブジェクトにのみ影響します。切り離されるオブジェクトのオブジェクトコンテキストに関連オブジェクトがある場合、それらのオブジェクトは切り離されません。
EFは、エンティティの状態を設定するとき、またはSaveChanges()
が呼び出されるときに、グラフ内の分離オブジェクトを自動的にアタッチします。
コンテキストからオブジェクトを切り離す必要がある理由は本当にわかりません。 AsNoTracking()
を使用して、最初にコンテキストにエンティティをアタッチせずに、データベースからエンティティをロードすることもできます。