私は Entity Framework 4.4 を使用しており、次のような 1 対多の関係モデルがあります。
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 インスタンスのリストを循環し、それぞれを db コンテキストに追加します。
foreach (var i in LocalItemList)
{
IDbSetExtensions.AddOrUpdate<Item>(db.Items, i);
}
dbContext.SaveChanges();
私が理解できない問題は、主キーの重複例外が発生しないようにコンテキストを伝える方法AddOrUpdate
ですContainer
。ある時点で、別Item
の と同じContainer
である に遭遇しますが、 で主キーの重複例外が発生しSaveChanges()
ます。
Add
DbSet のコンテナである場合Item
、セットにも s が追加されますか? 代わりにどうすればそれを作ることができAddOrUpdate
ますか?