我正在使用 Entity Framework 4.4,并且我有一个像这样的一对多关系模型:
class Item {
public string keyPart1 { get; set; }
public string keyPart2 { get; set; }
public virtual Container container { get; set; }
public string ContainerId { get; set; }
}
// Idea is that many Items will be assigned to a container
class Container {
public string ContainerId { get; set; }
private ICollection<Item> _Items;
public virtual ICollection<Item> As
{
get { return _Items ?? (_Items = new HashSet<A>()); }
protected set { _Items = value; }
}
}
现在,这是 DbContext:
public class StorageContext : DbContext
{
public DbSet<Item> Items { get; set; }
public DbSet<Bucket> Buckets { get; set; }
public override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Item>().HasKey( i => new { i.keyPart1, i.keyPart2 } ).HasRequired( i => i.Container );
}
}
现在,假设我有 N 个 Item 实例。每个 Item 都属于一个容器,该容器包含多个 item 实例,每个实例都属于一个容器,因此模型会无限递归。
然后我想循环浏览我当前的 Item 实例列表并将每个实例添加到 db 上下文中:
foreach (var i in LocalItemList)
{
IDbSetExtensions.AddOrUpdate<Item>(db.Items, i);
}
dbContext.SaveChanges();
我无法弄清楚的问题是如何告诉上下文,AddOrUpdate
这样Container
我就不会得到主键重复异常。在某些时候,我们会遇到一个与另一个Item
相同Container
的,但我会在SaveChanges()
.
如果我Add
是 DbSet 的容器,是否也将Item
s 添加到 Set 中?我怎样才能做到这一点AddOrUpdate
?