Jon*_*nna 8 entity entity-framework
如何使用DbContext和使用Repository模式对CTP 5进行更新操作?早期使用EF 4.0,可以像下面这样完成.
_context.Customers.AddObject(item);
_context.ObjectStateManager.ChangeObjectState(item, System.Data.EntityState.Modified);
Run Code Online (Sandbox Code Playgroud)
有没有理由说为什么EF不提供更新"断开连接"实体的简单方法.我不想查询数据库并将所有属性复制到从查询返回的对象.换句话说,EF应该具有接收实体的更新方法(类似于Add方法).如果实体密钥已存在于数据库中,请使用当前值更新实体.即为什么我们应该"附加",然后将所有属性复制到附加对象.对我来说,复制实体的所有属性似乎是多余的,只是在"已断开连接"的对象已经存在时进行更新.
我相信你仍然可以执行与代码示例中相同的方法来使用CTP5 DbContext更新断开连接的实体:
_dbContext.Customers.Add(item);
DbEntityEntry entry = _dbContext.Entry(item);
entry.State = EntityState.Modified;
_dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
查看生成的SQL,这当然会创建客户对象的所有属性的完整更新语句,包括实际上没有更改的属性,因为EF不知道数据库中的当前状态是什么.如果你想避免这种情况,我想除了可以这样做之前在数据库中获取当前状态之外别无他法:
DbEntityEntry entry = _dbContext.Entry(_dbContext.Customers.Find(item.ID));
entry.CurrentValues.SetValues(entity);
_dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
(假设您ID
在客户对象"item"上有一个键.)
这将创建一个SQL更新语句,该语句仅包含与数据库中的状态相比确实已更改的属性.由于附加的select语句,我不确定第二种方式是否必然是性能较差的选项.如果对象类型很大但只有很少的属性发生了变化,那么在所有字段上发送完整更新语句的开销可能比select语句加上一个"小"更新语句大,只有更新所需的字段.(但这只是猜测,我不是SQL Server的专家.)
归档时间: |
|
查看次数: |
5074 次 |
最近记录: |