CTP5 обновление каскада - PullRequest
       5

CTP5 обновление каскада

0 голосов
/ 18 февраля 2011

Мне нужен шаблон добавления или обновления для CTP5.Предполагая модель:

public class User
{
    public int UserId { get; set; }
    public ICollection<Address> Addresses { get; set; }
}
public class Address
{
    public int AddressID { get; set; }
    public string Location { get; set; }
}

Если я добавлю нового пользователя, то заполняется таблица адресов Coresponding.Но если пользователь уже находится в БД, я получу исключение DbUpdateException.В этом случае я хочу, чтобы данные в базе данных были обновлены новыми данными.Как я могу это сделать?

данные в базе данных

Адрес таблицы

Адрес ID Location

1 JohnPlace

2 MaryPlace

3 JimmyPlace

Обновление пользователя, которого я обновляю, содержит в коллекции адресов 1 элемент с AddressId: 2, Location = GeorgePlace.Но для ID = 2 в БД уже есть запись с location = MarryPlace.Я хочу, чтобы GeorgePlace перезаписал MarryPlace.

У меня не может быть адреса, который не назначен пользователю

Я создаю пользователя как:

var user=new User();
user.Id=GetUserIDfromService();
foreach(var address in GetAddressesFromService(user.Id)){
    user.Addresses.Add(address);
}
context.Users.Add(user);
context.SaveChanges();//this may throw an exception, because there is already a user with this id.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2011

Ваша текущая проблема заключается в том, что вы готовите новый объект User и заполняете его адреса, но адреса не загружаются из БД через тот же контекст, поэтому контекст не знает их. Когда вы вызываете метод Add, он возьмет все объекты в графе объектов и пометит их как новые (для вставки). Единственный способ избежать этого - вручную сказать, какой адрес новый, а какой только модифицировать или загрузить адреса из контекста, прежде чем добавлять их в экземпляр пользователя.

Код для маркировки адресов может выглядеть следующим образом:

var user = new User(); 
user.Id = GetUserIDfromService(); 
context.Users.Add(user); 
foreach(var address in GetAddressesFromService(user.Id))
{
  context.Addresses.Attach(address);
  // Let say that new address always have 0 Id      
  context.Entry(address).State = address.Id == 0 ? EntityState.Added : EntityState.Modified;      
  user.Addresses.Add(address); 
} 

context.SaveChanges();
0 голосов
/ 18 февраля 2011

Если вы хотите обновить существующего пользователя, не вставляйте его (не звоните Add()) Сначала загрузите пользователя по Id, затем измените его свойства и вызовите SaveChanges() в контексте.

var db = new DatabaseContext();
var user = db.Users.Find(myUserId);
user.Name = "New Name";
db.SaveChanges();
...