我读了这篇文章,仍然误解了关键时刻。我们不需要打电话吗?
_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();
}
你问:
我们不需要打电话吗_context.SaveChanges ()在每次删除/更新/…操作?
不,我们没有。当调用Delete
时,我们并不实际删除实体-我们标记用于删除。
同样的事情与Update
,虽然你不需要做任何其他的改变你想要的实体。所有属性(由默认模板生成)都将实现INotifyPropertyChanged
,因此它知道实体何时被修改。
所有实体(首先在数据库中-由默认模板自动生成)具有State
属性。只要在ObjectEntity范围内发生更改,该属性由ObjectContext
维护。
。
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
您可以在内存上下文中执行许多更改,例如插入、更新和删除。调用SaveCahnges()后,您所做的所有更改都将被保存在数据库中的单个事务。这意味着要么全部提交,要么一个都不提交如果出现错误