【发布时间】:2017-10-05 10:21:06
【问题描述】:
我正在使用实体框架 5.0。我正在将我的应用程序从 ObjectContext 更改为 DbContext 模型。 DbContext 应该是按照microsoft 推荐的方法。我使用数据库 forst 方法,并生成了模型表单数据库。 但是,在第一个简单的任务中就有一个问题。即记录的简单更新被破坏。
让我们有一个简单的表项,仅供说明:
Item
(
ItemId int NOT NULL, -- Primary key
Name nvarchar(50) NOT NULL,
Description NVARCHAR(50)
)
我注意到使用 DbContext 不像 ObjectContext 那样支持更新记录。 在我的应用程序中,我有一个简单的更新方法。
public void UpdateItem()
{
MyContext context = new MyContext();
Item item = new Item();
item.ItemId = 666;
context.Items.Attach(item);
// From this point onward EF tracks the changes I make to Item
Item.Description = "Some description";
context.SaveChanges();
}
使用 ObjectContext 此方法正确更新记录。使用 SQL 探查器,我可以看到它生成了类似这样的内容(非常简单!!!)
UPDATE Item
SET Description = 'Some description'
WHERE ItemId = 666
但是,如果我尝试在 DbContext 中执行相同的操作,则会出现异常:
System.Exception: Items.aspx.cs - logged from CustomError() ---> System.Data.Entity.Validation.DbEntityValidationException: Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
at System.Data.Entity.Internal.InternalContext.SaveChanges()
at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
at System.Data.Entity.DbContext.SaveChanges()
并且没有向 Sql server 发出数据库 UPDATE。 我猜 DbContext 验证了所有属性并且属性 Name 为空。这是设计使然。我不打算修改它,我什至不知道它是什么,我不需要知道它是什么。 只有属性描述被更改。显然 ObjectContext 没有正确跟踪更改。 如何解决这个问题?
我已经研究了这个问题,并发现了有关更新记录的内容。 例如这个链接:https://stackoverflow.com/a/15339512/4601078
db.Users.Attach(updatedUser);
var entry = db.Entry(updatedUser);
entry.Property(e => e.Email).IsModified = true;
// other changed properties
db.SaveChanges();
但这是可怕的代码。对于每个属性都应该添加一行:
entry.Property(e => e.Email).IsModified = true;
这会产生难看的不可读代码,我怀疑 lamda 表达式的性能并不出色。
更糟糕的是那些建议往返数据库以获取填充了所有属性的现有记录、更新它并保存更改的人。就性能而言,这是不行的。
那么,如何处理简单的实体更新,或者这个 DbContext 只是微软死胡同集合中的另一个项目,没有真正的用途?
【问题讨论】:
标签: c# .net entity-framework entity-framework-5