我尝试了以下内容:
public void UpdatePlayer(int id)
{
Player player = new Player() {ID = id};
player.Password = "12";
Entities.Players.Attach(player);
Entities.SaveChanges();
}
数据库没有变化。
我错过了什么?
答案 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。
答案 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();