9

我已经阅读了这篇文章,但仍然误解了关键时刻。我们不需要打电话吗

_context.SaveChanges()

在每个 Delete/Update/... 操作中?

如果我更改任何实体的属性,是否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();
}
4

2 回答 2

4

你问:

我们不需要在每个 Delete/Update/... 操作中调用 _context.SaveChanges() 吗?

不,我们没有。调用时, Delete我们不会实际删除实体 - 我们将其标记为删除。

与 相同Update,尽管您不必执行任何其他操作来对实体进行您想要的更改。所有属性(由默认模板生成)都将实现INotifyPropertyChanged,因此它知道何时修改了实体。

所有实体(首先在数据库中 - 由 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所有具有状态Added Deleted或将在本地事务Modified中将其更改持久保存到数据库的实体

编辑

如果一个实体被标记为删除,并且您尝试修改它 - 您将得到一个InvalidOperationException

于 2013-03-14T08:15:08.593 回答
2

您可以在内存上下文中执行许多更改,例如插入、更新和删除。一旦您调用 SaveCahnges(),您所做的所有更改都将在单个事务中保存在数据库中。这意味着要么它们都被提交,要么在出现错误的情况下都不提交。

于 2013-03-14T07:47:28.813 回答