Сохранение в 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 они все подано, или никто из них в случае ошибки.