Наиболее эффективная обработка кода создания, обновления, удаления с помощью Entity Framework First
Примечание. Я использую 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;
}
Ответы
Ответ 1
Для добавления:
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();
}
И частный Save()
метод, который возвращает true или false, чтобы вы могли легко избавиться от контроллера в зависимости от результата
private bool Save()
{
return DataContext.SaveChanges() > 0;
}
Это только часть моего общего репозитория. Он отлично работает в корпоративных приложениях.
UPDATE:
Отключение влияет только на конкретный объект, переданный методу. Если объект, находящийся в стороне, имеет связанные объекты в контексте объекта, те объекты не отсоединяются.
EF автоматически присоединяет отдельные объекты в графе при настройке состояния объекта или при вызове SaveChanges()
.
Я действительно не знаю, почему вам нужно отделять объекты от контекста. Вы также можете использовать AsNoTracking()
для загрузки объектов из базы данных, не вставляя их в контекст в первую очередь.