Как обновить сущность без обратной передачи?(EF 4) - PullRequest
7 голосов
/ 03 декабря 2010

Я попробовал следующее:

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

Без изменений в БД.
Чего мне не хватает?

Ответы [ 4 ]

13 голосов
/ 03 декабря 2010

Я думаю, это может быть потому, что вы устанавливаете значения до того, как присоедините объект - контекст данных не будет знать, какие поля изменились. Попробуйте:

public void UpdatePlayer(int id)
{
    Player player = new Player() {ID  = id};
    Entities.Players.Attach(player);
    player.Password = "12";
    Entities.SaveChanges();
}
3 голосов
/ 03 декабря 2010

присоединение используется для сущностей, которые уже существуют в базе данных, но вы должны сначала присоединить, а затем отредактировать его, как указал другой автор.вы должны использовать .Add вместо .Attach, если вы создаете новые элементы.

FYI Entity Framework 4 - AddObject vs Attach

2 голосов
/ 03 декабря 2010

Как уже упоминалось, когда вы присоединяете сущность, она устанавливается в состояние «Не изменено», поэтому вы должны вручную установить состояние «Изменено». Но учтите, что установка состояния для всей сущности может привести к обновлению всех полей. Таким образом, если ваша сущность 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();
1 голос
/ 03 декабря 2010

Когда вы присоединяете сущность с помощью метода Attach , сущность переходит в неизменный EntityState, то есть она не изменилась с момента присоединения к контексту.Поэтому EF не будет генерировать необходимый оператор обновления для обновления базы данных.

Все, что вам нужно сделать, это дать подсказку EF, изменив EntityState на Modified :

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