Сохранение в entity framework
я прочитала этой статья и все еще непонимание ключевых моментов. Разве нам не нужно позвонить
_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();
}
2 ответов
ты спрашиваешь:
не нужно называть _контекст.Метод SaveChanges() в каждом Delete / Update/... операции?
нет, не знаем. При вызове Delete
мы не случайно удаляем объект-we Марк его для удаления.
то же самое и с Update
, хотя вам не нужно делать ничего другого, чтобы внести изменения, которые вы хотите в сущность. Все свойства (созданные шаблоном по умолчанию) будут реализовывать INotifyPropertyChanged
так он знает, когда сущность изменяется.
все сущности (в базе данных first-autogenerated шаблоном 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
все entites, которые имеют состояние Added
Deleted
или Modified
их изменения будут сохранены в базе данных в местный сделки
редактировать
если объект помечен для удаления, и вы пытаетесь его изменить-вы получите InvalidOperationException
вы можете выполнить много изменений в вашем контексте в памяти, например, вставки, обновления и удаления. После вызова SaveCahnges () все внесенные вами изменения будут сохранены в БД при одной транзакции. Это означает, что eiteher они все подано, или никто из них в случае ошибки.