如何在没有往返的情况下更新实体? (EF 4)

时间:2010-12-03 15:37:07

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

我尝试了以下内容:

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

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

4 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:3)

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

仅供参考Entity Framework 4 - AddObject vs Attach

答案 2 :(得分:2)

正如您在附加实体时所提到的那样,它被设置为Unchanged状态,因此您必须手动将状态设置为Modified。但请注意,为整个实体设置状态可能会导致更新所有字段。因此,如果您的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();

答案 3 :(得分:1)

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

您需要做的就是通过将 EntityState 更改为修改来提示EF:

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