У меня возникают проблемы с EF, переупорядочивающим мои вставки, когда я пытаюсь добавить объект с несколькими дочерними элементами одновременно. У меня есть трехуровневая структура с одним -до -множеством отношений между каждым(Outer 1--* Item 1--* SubItem
). Если я попытаюсь вставить новый внешний объект с элементами и подэлементами, элементы, содержащие подэлементы, в конечном итоге будут вставлены первыми.
Пример кода (.NET 4.5, EF 5.0.0 -rc):
public class Outer
{
public int OuterId { get; set; }
public virtual IList- Items { get; set; }
}
public class Item
{
public int OuterId { get; set; }
[ForeignKey("OuterId")]
public virtual Outer Outer { get; set; }
public int ItemId { get; set; }
public int Number { get; set; }
public virtual IList
SubItems { get; set; }
}
public class SubItem
{
public int SubItemId { get; set; }
[ForeignKey("ItemId")]
public virtual Item Item { get; set; }
public int ItemId { get; set; }
}
public class MyContext : DbContext
{
public DbSet Outers { get; set; }
public DbSet- Items { get; set; }
public DbSet
SubItems { get; set; }
}
class Program
{
static void Main(string[] args)
{
Database.SetInitializer(new DropCreateDatabaseAlways());
MyContext context = new MyContext();
// Add an Outer object, with 3 Items, the middle one having a subitem
Outer outer1 = new Outer { Items = new List- () };
context.Outers.Add(outer1);
outer1.Items.Add(new Item { Number = 1, SubItems = new List
() });
outer1.Items.Add(new Item { Number = 2, SubItems = new List(new SubItem[] { new SubItem() }) });
outer1.Items.Add(new Item { Number = 3, SubItems = new List() });
context.SaveChanges();
// Print the order these have ended up in
foreach (Item item in context.Items)
{
Console.WriteLine("{0}\t{1}", item.ItemId, item.Number);
}
// Produces output:
// 1 2
// 2 1
// 3 3
}
}
Мне известен этот ответ Алекса Джеймса , в котором говорится, что может потребоваться переупорядочение вставок, чтобы удовлетворить реляционным ограничениям, но здесь проблема не в этом. В его ответе также упоминается, что они не могут отслеживать порядок элементов в порядке -, сохраняя такие структуры, как списки.
Я хотел бы знать, как я могу заказать эти вставки. Хотя я могу полагаться на сортировку вставленных элементов по полю, отличному от PK, гораздо эффективнее полагаться на порядок PK. Я действительно не хочу использовать несколько вызовов SaveChanges для достижения этой цели.
Я использую EF5 RC, но, судя по другим оставшимся без ответа вопросам, он существует уже некоторое время!