0

我需要 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; }
}

如果我添加一个新用户,也会填充相应的地址表。但是如果用户已经在数据库中,我会得到一个 DbUpdateException。在这种情况下,我希望使用新数据更新数据库中的数据。我怎样才能做到这一点?

数据库中的数据

表地址

地址ID 位置

1 约翰广场

2 玛丽广场

3 吉米广场

我更新的用户在 Addresses 集合 1 中具有 AddressId:2,Location=GeorgePlace。但是对于 ID=2,在 Db 中已经有一条 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.
4

2 回答 2

0

您当前的问题是您准备新的 User 对象并填充其地址,但地址不是通过相同的上下文从 DB 加载的,因此上下文不知道它们。当您调用 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();
于 2011-02-18T10:08:53.687 回答
0

如果要更新现有用户,请不要插入(不要调用Add())首先按 Id 加载用户,而不是修改其属性并调用SaveChanges()上下文。

var db = new DatabaseContext();
var user = db.Users.Find(myUserId);
user.Name = "New Name";
db.SaveChanges();
于 2011-02-18T08:26:49.343 回答