我们有什么:
- 模型
Product - 模型
User
表之间有不同的关系:
Product可能包含列表UsersProduct可能包含备用列表UsersProduct包含一个Creator也位于UsersUser可能包含列表ProductsUser可能包含备用列表Products
楷模:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
[ForeignKey("CreatorId")]
public virtual ICollection<Product> ProductsAsCreator { get; set; }
public virtual ICollection<Product> ProductsAsMain { get; set; }
public virtual ICollection<Product> ProductsAsReserve { get; set; }
}
public class Product
{
public int Id { get; set; }
public string Title { get; set; }
[ForeignKey("CreatorId")]
public virtual User Creator { get; set; }
public int? CreatorId { get; set; }
public virtual ICollection<User> UsersAsMain { get; set; }
public virtual ICollection<User> UsersAsReserve { get; set; }
}
需要什么:
- 更新/添加
Products,其中可能包含新Users的和现有的,有或没有更改,也需要更新/添加。
现在我尝试先添加所有用户,然后再添加产品:
using (DbContext db = new DbContext())
{
foreach (var product in Products)
{
if (product.Creator != null)
{
db.Users.AddOrUpdate(product.Creator);
}
db.Users.AddRange(product.UsersAsMain);
db.Users.AddRange(product.UsersAsReserve);
}
db.Products.AddRange(Products);
db.SaveChanges();
}
显然我做错了,当SaveChanges抛出异常时:
约束失败 UNIQUE 约束失败:Users.Id
这是可能的,因为:
db.Users.AddRange(product.UsersAsMain);可能包含Creator之前添加的,现在正在重试db.Products.AddRange(Products);包含刚刚添加的所有用户,并且还在尝试再次添加
问题:
- 最重要的是如何构建更新/添加所有这些的逻辑?
- 是否可以在不使用嵌套元素的额外迭代的情况下进行
AddOrUpdate?
只留下
Entity Framework他会补充Users