entity-framework - Entity Framework 中多条记录的插入顺序

标签 entity-framework entity-framework-5

当我尝试一次添加一个具有多个子级的实体时,我遇到了 EF 重新排序插入的问题。我有一个 3 级结构,每个结构之间都有一对多的关系( Outer 1--* Item 1--* SubItem )。如果我尝试插入带有项目和子项目的新外部,则包含子项目的项目最终会被首先插入。

示例代码(.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
    }
}

我知道 this answer by Alex James其中指出插入可能需要重新排序以满足关系约束,但这不是这里的问题。他的回答还提到他们无法在诸如列表之类的保持顺序的结构中跟踪项目的顺序。

我想知道如何订购这些插件。虽然我可以依靠 PK 以外的字段对插入的项目进行排序,但如果我可以依靠 PK 顺序,效率会高得多。我真的不想使用多个 SaveChanges 调用来完成此操作。

我正在使用 EF5 RC,但从周围其他未回答的问题来看,这已经存在了一段时间!

最佳答案

What I'd like to know is how I can get these inserts to be ordered.



你不能。数据库命令的顺序是 EF 的内部行为。如果您想控制命令的顺序,请不要使用将您从低级数据库交互中抽象出来的工具 - 直接使用 SQL。

根据评论编辑:

是的,这是低级交互,因为在使用不受您控制的抽象时,您对 SQL 命令的顺序寄予厚望。在高层次上,您会得到不同的东西,因为您使用的期望不适用于该抽象。如果您想控制 SQL 命令的顺序,您必须通过一项一项保存项目(=> 多个 SaveChangesTransactionScope )来强制执行 EF,或者自己编写 SQL。否则使用单独的列进行排序。

顺便提一句。如您所见,EF 不会保存实体。它有自己的更改跟踪器,保存对所有附加实例的引用。引用保存在多个 Dictionary实例和字典 doesn't preserve insertion order .如果这些集合用于生成 SQL 命令(我猜它们是),则无法保证顺序。

关于entity-framework - Entity Framework 中多条记录的插入顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11521057/

相关文章:

entity-framework - DbContext.Entry 附加实体

c# - 是否有可能在将其保存在 Entity Framework 之前获取身份字段值

entity-framework - 使用 edmx 设计器将 Entity Framework 中的列合并为一列

c# - 为什么 visual studio 在我更新 Entity Framework 模型时删除了我的类

c# - 无法删除该对象,因为在 Entity Framework 5 中的 ObjectStateManager 中找不到它

c# - 在 C# 中的数据模型上运行 lambda 时不支持的异常

entity-framework - 选择最后插入的十行

c# - Entity Framework 6 : Master-Detail view shows single HashSet instead of filtered detail items

c# - 注册用户 asp.net 身份模型错误

c# - 基本登录 Controller