问题 没有首先获得实体的EF4更新实体


如何更新实体而无需拨打电话进行选择。如果我为实体提供密钥,那么在ObjectContext上调用SaveChanges()之后,它是否应该知道更新。

我目前这样做:

var user = context.Users.Single(u => u.Id == 2);
user.Username = "user.name";
user.Name = "ABC 123";
context.SaveChanges();

这有效,但强制选择。因为我知道 Id为什么我不能这样做:

var user = new User();
user.Id = 2;
user.Username = "user.name";
user.Name = "ABC 123";
context.UpdateObject(user);
context.SaveChanges();

提前致谢。

编辑: 而且,重要的是 只要 更改的受影响属性将更新。这可能吗?


4196
2017-07-08 13:23


起源



答案:


也许以下代码工作正常。

var user = new User();
user.Id = 2;
context.Users.Attach(user);

user.Username = "user.name";
user.Name = "ABC 123";

context.SaveChanges();

12
2017-07-08 14:24



实际上并没有 更新 数据库中的对象。它将它添加到用户列表中。 - TheCloudlessSky
调用 context.ObjectStateManager.GetObjectStateEntry(user).ChangeState(EntityState.Modified); 确实执行更新... - TheCloudlessSky
你在“context.Users.Attach(user);”之后更改了Name属性吗? - user386740
是的,我的错。这很有效,可以修改属性 后 该 Attach() 当一个属性被修改时,它只会更新 变 属性。谢谢! - TheCloudlessSky
应该注意的是,如果你做了一个 foreach 上 context.Users 你会看到的 User  不 充满了其他属性。 - TheCloudlessSky


答案:


也许以下代码工作正常。

var user = new User();
user.Id = 2;
context.Users.Attach(user);

user.Username = "user.name";
user.Name = "ABC 123";

context.SaveChanges();

12
2017-07-08 14:24



实际上并没有 更新 数据库中的对象。它将它添加到用户列表中。 - TheCloudlessSky
调用 context.ObjectStateManager.GetObjectStateEntry(user).ChangeState(EntityState.Modified); 确实执行更新... - TheCloudlessSky
你在“context.Users.Attach(user);”之后更改了Name属性吗? - user386740
是的,我的错。这很有效,可以修改属性 后 该 Attach() 当一个属性被修改时,它只会更新 变 属性。谢谢! - TheCloudlessSky
应该注意的是,如果你做了一个 foreach 上 context.Users 你会看到的 User  不 充满了其他属性。 - TheCloudlessSky


您可以通过添加实体并将EntityState更改为Modified来以一种有点人为的方式执行此操作:

var user = new User();
user.Id = 2;
user.Username = "user.name";
user.Name = "ABC 123";

context.AddToUsers(user);
ObjectStateEntry userEntry = context.ObjectStateManager.GetObjectStateEntry(user);
userEntry.ChangeState(EntityState.Modified);

context.SaveChanges();

通过这种方式,您将告诉ObjectContext查找Id = 2的条目并更新它而不是向数据库添加新条目。


4
2017-07-08 14:03



好,这很酷。作品但是 一 问题。如果我只想改变它怎么办? Name 属性。我不希望所有字段都导致更新。这是EF的限制吗? - TheCloudlessSky
它的工作就像一个魅力...谢谢。 - sikender


你是不是必须选择它才能获得要编辑的数据? 如果你对它进行缓存,那么在保存它时不会再花费任何费用。


-1
2017-07-08 13:55



在典型的Web应用程序中,您执行选择,生成包含Id的页面,并“忘记它”。用户更新信息并提交表单后,您将返回Id和新数据。这是你想要更新的时候,而不是在更新前获取你不需要额外时间的数据。 - Yakimych
@Yakimych - 是的,这正是我正在与之合作的情况。即使我有数据,我也不需要去数据库中选择它。 - TheCloudlessSky