【问题标题】:Inserting multiple related entities into a db using Entity Framework, what am I doing wrong?使用实体框架将多个相关实体插入数据库,我做错了什么?
【发布时间】:2009-03-17 12:09:41
【问题描述】:

我有 3 个实体

  • 打印机
  • 服务器
  • 驱动程序

打印机具有服务器和驱动程序属性

在我的代码中,我设置了一个 IEnumerable,其中每个打印机实例都拥有自己的服务器和驱动程序实体。

现在,当我尝试将其提交到数据库时,我正在使用以下代码:

foreach (Printer p in printers)
  {
   printmanEntities _dc = new printmanEntities();
   p.Driver = _dc.DriverSet.FirstOrDefault(d => d.Name == p.Driver.Name) ?? p.Driver;
   p.Server = _dc.ServerSet.FirstOrDefault(s => s.Name == p.Server.Name) ?? p.Server;

   _dc.AddToPrinterSet(p);

   _dc.SaveChanges();  
   }

假设我将为每个打印机对象获取一条记录,并为每个唯一的驱动程序和服务器名称获取一条记录。但实际结果是相当连贯的。

上面的代码为每个唯一的 Driver 对象生成一个记录,但没有明显的原因为每个唯一的服务器创建多个记录。并且所有打印机记录都指向单个服务器记录。

此外,如果我首先分配 p.Server,那么我只会获得服务器实体的唯一记录,但会获得驱动程序实体的多条记录。

我做错了什么?

更新:将 EF 替换为 LINQ2SQL,它的工作方式与我预期的一样。每个唯一实体都有一行,仅此而已。

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    这表明 dc.ServerSet.FirstOrDefault(s => s.Name == p.Server.Name) 返回 null,但 Driver 调用返回一条记录。为什么?我不知道。查看 SQL Profiler 并查看从数据库服务器返回的内容。不过,它会解释你的结果。

    更新:我想我可能已经弄清楚这里发生了什么。尝试如下更改您的代码。如果可行,我会解释原因。

    printmanEntities _dc = new printmanEntities();
    _dc.AddToPrinterSet(p);
    
    p.Driver = _dc.DriverSet.FirstOrDefault(d => d.Name == p.Driver.Name) ?? p.Driver;
    p.Server = _dc.ServerSet.FirstOrDefault(s => s.Name == p.Server.Name) ?? p.Server;
    
    _dc.SaveChanges();  
    

    请注意,我在这里所做的唯一一件事就是更改操作顺序。

    【讨论】:

    • 虽然听起来像有线,但它确实返回了正确的值,并且 db 表中的所有打印机都链接到正确的服务器。我想我刚刚发现了一个有线错误。
    • 接下来发生了其他事情。我不能从示例中说出什么,但我从未见过实体框架错误地做这种事情。
    【解决方案2】:

    奇怪的是,DataContainer 不会返回您附加到图形但没有提交到 db 作为查询结果的实体。所以你不能得到你添加的实体,但 Select() 不允许。 )-:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 2021-08-14
      • 1970-01-01
      • 2011-07-30
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多