Я использую Entity Framework 4.4 и у меня есть модель One-To-Many отношения вроде этого:Как добавить объекты в DbContext с рекурсивными отношениями, избегая дублирования дополнений?
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 Пункт экземпляров. Каждый элемент принадлежит контейнеру, который содержит несколько экземпляров элементов, каждый из которых принадлежит контейнеру, и поэтому модель повторяется бесконечно.
Я хочу, чтобы затем цикл через мой текущий список экземпляров Вещей и добавить друг к контексту дб:
foreach (var i in LocalItemList)
{
IDbSetExtensions.AddOrUpdate<Item>(db.Items, i);
}
dbContext.SaveChanges();
Проблема, которую я не могу понять, как сказать контекст AddOrUpdate
Container
так что я не получаю дубликаты первичных ключей. В какой-то момент мы столкнемся с Item
, который имеет тот же Container
как другой, но я получу дублирующее первичное ключевое исключение на SaveChanges()
.
Если I Add
Контейнер для DbSet, то есть Item
s, который также добавлен в комплект? Как я могу сделать это AddOrUpdate
?