保存在实体框架中

本文关键字:框架 实体 存在 保存 | 更新日期: 2023-09-27 18:03:45

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

_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,所有状态为AddedDeletedModified的实体将在本地事务

中将它们的更改持久化到数据库

编辑

如果一个实体被标记为删除,而你试图修改它-你将得到一个InvalidOperationException

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