【问题标题】:How do I insert records using Entity Framework with nested list of objects?如何使用带有嵌套对象列表的实体框架插入记录?
【发布时间】:2018-02-07 02:21:02
【问题描述】:

我正在调用一个端点并接收一个对象列表,我们称它们为Receipts。每个收据可以包含一个可变数量的列表Vehicles。我想使用由收据 ID 和车辆 ID 组成的复合键保存记录。

我将模型设置为:

public class Receipt
{
        [Key]
        [Column(Order=1)]
        public string id { get; set; }
        public int count { get; set; }
        public List<Vehicles> vehicles { get; set; }

        public class Vehicles
        {
            [Key]
            [Column(Order=2)]
            public string id { get; set; }
        }
 }

接下来,我将 Receipt 添加到 DbContext

public class DbContext : System.Data.Entity.DbContext
{
    public DbSet<Receipt> Receipt { get; set; }
}

最后,我插入/更新并保存更改

try
{
    using (var dbContext = new DbContext())
    {
         dbContext.Receipt.AddOrUpdate(receipt);
         dbContext.Receipt.SaveChanges();
    }
}

我的程序没有捕获任何异常,但表/数据库完全为空。我是否正在构建对象以告知实体框架我希望如何保存这些行?一种选择是遍历收据中的每个车辆,并创建一个新实体来存储收据 ID 和车辆 ID 以及所需的其他字段

【问题讨论】:

  • 您需要将Receipt 类中的Vehicles 属性设为public virtual ICollection&lt;Vehicles&gt; Vehicles {get; set;}。此外,我建议将嵌套类 Vehicles 取出到它自己的单独类中。这将使 EF 能够正确计算出更改的详细信息并更新数据库。
  • @VidmantasBlazevicius 将车辆分离到一个单独的类中,将车辆 ID 标记为 [Key][Column(Order=2)],然后将 Receipt 中的属性设置为 public virtual ICollection&lt;&gt; 仅将车辆表添加到 EF(我没有想要)并且仍然是空的。想要包含每个车辆及其关联的订单的行记录

标签: c# .net entity-framework


【解决方案1】:

由于您的数据库完全是空的,并且您的代码也没有显示任何迹象,恐怕您的问题的解决方案实际上是 调用

dbContext.SaveChanges(); 

如评论中所述,要使其真正按预期工作,您的属性应该是

public virtual ICollection<Vehicles> Vehicles { get; set; }

虽然我不知道这是否有问题,但我建议将您的 Vehicle 类作为普通的非嵌套类。

【讨论】:

  • 我打电话给SaveChanges(),正在编辑我的帖子以包含抱歉。我在过去的示例中看到了嵌套类,并且之前已经这样做过并且效果很好,但会开始将它们移出到他们自己的类中。这并没有解决问题,因为表仍然是空的,并且它创建了一个不需要的 Vehicle 表
  • 犯了一个简单的错误并修复了它。一切都按照您所说的进行设置,但我现在在尝试保存时收到EntityValidationError
猜你喜欢
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多