【问题标题】:How to update an entity without a round-trip? (EF 4)如何在没有往返的情况下更新实体? (英法 4)
【发布时间】:2010-12-03 15:37:07
【问题描述】:

我尝试了以下方法:

public void UpdatePlayer(int id)
{
    Player player = new Player() {ID  = id};
    player.Password = "12";
    Entities.Players.Attach(player);
    Entities.SaveChanges();
}

数据库没有变化。
我错过了什么?

【问题讨论】:

    标签: asp.net entity-framework entity-framework-4


    【解决方案1】:

    我认为这可能是因为您在附加对象之前设置了值 - 数据上下文将不知道哪些字段已更改。试试:

    public void UpdatePlayer(int id)
    {
        Player player = new Player() {ID  = id};
        Entities.Players.Attach(player);
        player.Password = "12";
        Entities.SaveChanges();
    }
    

    【讨论】:

    • 古老的“Stub Entity”技巧 - 对 Alex James 的赞美。 +1
    【解决方案2】:

    attach 用于数据库中已经存在的实体,但您必须先附加,然后对其进行编辑,正如另一位海报指出的那样。 如果您要创建新项目,则应使用 .Add 而不是 .Attach。

    仅供参考Entity Framework 4 - AddObject vs Attach

    【讨论】:

    • 我怀疑他没有尝试添加新实例,否则他不会提供 id...Adir?编辑:标题也是如何更新一个实体:)
    • 我不认为你是这样查询一个人的
    • 我不认为他在查询一个,只是更新一个 - EF 确实支持以这种方式更新实体 - 我刚刚尝试过,如果你确实颠倒了第 2 行和第 3 行它工作。
    【解决方案3】:

    正如您在附加实体时已经提到的,它设置为未更改状态,因此您必须手动将状态设置为已修改。但请注意,为整个实体设置状态可能会导致所有字段的更新。因此,如果您的 Player 实体有多个 Id 和 Password 字段,则所有其他字段可能会设置为默认值。对于这种情况,请尝试使用:

    Entities.Players.Attach(player);
    var objectState = Entities.ObjectStateManager.GetObjectStateEntry(player);
    objectState.SetModifiedProperty("Password");
    Entities.SaveChanges();
    

    您也可以在附加实体后尝试设置密码:

    Entities.Players.Attach(player);
    player.Password = "12";
    Entities.SaveChanges();
    

    【讨论】:

      【解决方案4】:

      当你使用 Attach 方法附加实体时,实体将进入 Unchanged EntityState,也就是说,它自从附加到上下文后就没有改变。因此,EF 不会生成必要的更新语句来更新数据库。

      您需要做的就是通过将 EntityState 更改为 Modified 来给 EF 一个提示:

      Entities.Players.Attach(player);    
      Entities.ObjectStateManager.ChangeObjectState(player, EntityState.Modified)    
      Entities.SaveChanges();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-11
        • 1970-01-01
        • 1970-01-01
        • 2016-05-19
        • 2016-11-08
        相关资源
        最近更新 更多