当我尝试一次添加一个具有多个子级的实体时,我遇到了 EF 重新排序插入的问题。Outer 1--* Item 1--* SubItem
我有一个 3 级结构,每个 ( )之间具有一对多的关系。如果我尝试插入带有项目和子项目的新外部,则包含子项目的项目最终会被首先插入。
示例代码(.NET 4.5、EF 5.0.0-rc):
public class Outer
{
public int OuterId { get; set; }
public virtual IList<Item> 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<SubItem> 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<Outer> Outers { get; set; }
public DbSet<Item> Items { get; set; }
public DbSet<SubItem> SubItems { get; set; }
}
class Program
{
static void Main(string[] args)
{
Database.SetInitializer(new DropCreateDatabaseAlways<MyContext>());
MyContext context = new MyContext();
// Add an Outer object, with 3 Items, the middle one having a subitem
Outer outer1 = new Outer { Items = new List<Item>() };
context.Outers.Add(outer1);
outer1.Items.Add(new Item { Number = 1, SubItems = new List<SubItem>() });
outer1.Items.Add(new Item { Number = 2, SubItems = new List<SubItem>(new SubItem[] { new SubItem() }) });
outer1.Items.Add(new Item { Number = 3, SubItems = new List<SubItem>() });
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
}
}
我知道Alex James 的这个回答,其中指出插入可能需要重新排序以满足关系约束,但这不是这里的问题。他的回答还提到他们无法在诸如列表之类的保持顺序的结构中跟踪项目的顺序。
我想知道如何订购这些插件。虽然我可以依靠 PK 以外的字段对插入的项目进行排序,但如果我可以依靠 PK 顺序,效率会高得多。我真的不想使用多个 SaveChanges 调用来完成此操作。
我正在使用 EF5 RC,但从周围其他未回答的问题来看,这已经存在了一段时间!