【问题标题】:EF4 Update Entity Without First Getting EntityEF4 更新实体而不首先获取实体
【发布时间】:2010-07-08 22:35:08
【问题描述】:

如何更新实体而无需调用来选择它。如果我为实体提供密钥,它是否应该在 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();

提前致谢。

编辑:另外,更新受影响的属性也很重要。这可能吗?

【问题讨论】:

    标签: c# entity-framework entity-framework-4


    【解决方案1】:

    也许下面的代码可以正常工作。

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

    【讨论】:

    • 这实际上并没有更新数据库中的对象。不过,它会将其添加到用户列表中。
    • 调用 context.ObjectStateManager.GetObjectStateEntry(user).ChangeState(EntityState.Modified); 确实会执行更新...
    • 你是否在“context.Users.Attach(user);”之后更改了 Name 属性?
    • 是的,我的错。这对修改属性 after Attach() 非常有效,并且当修改属性时,它只会更新 changed 属性。谢谢!
    • 应该注意的是,如果您在context.Users 上执行foreach,您会看到User not 填充了其他属性。
    【解决方案2】:

    您可以通过添加实体并将 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 的条目并更新它,而不是向数据库中添加新条目。

    【讨论】:

    • 好的,这很酷。作品,但一个的问题。如果我只想更改 Name 属性怎么办。我不希望所有字段都导致更新。这是 EF 的限制吗?
    【解决方案3】:

    你不是必须选择它来编辑它的数据吗? 如果您将其缓存,则在保存时再次获取它不会花费您任何费用。

    【讨论】:

    • 在典型的网络应用程序中,您执行选择,生成包含 Id 的页面,然后“忘记它”。用户更新信息并提交表单后,您将返回 ID 和新数据。此时您只想更新,而不是在更新之前获取不需要额外时间的数据。
    • @Yakimych - 是的,这正是我正在处理的情况。即使我有数据,我也不需要去 db 去选择它。
    猜你喜欢
    • 1970-01-01
    • 2011-05-15
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 2012-01-08
    • 2013-04-02
    • 1970-01-01
    相关资源
    最近更新 更多