Entity Framework Core无法保存相关数据

6

继昨天的文章之后

两个实体

public class Realtor
{
    public Realtor()
    {
        Guid = Guid.NewGuid();
        Registration = DateTime.Now;
    }
    public int Id { get; set; }
    public Guid Guid { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime Registration { get; set; }
    public int SubdivId { get; set; }
    public Subdiv Subdiv { get; set; }
}

public class Subdiv
{
    public Subdiv()
    {
        Created = DateTime.Now;
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime Created { get; set; }
    public List<Realtor> Realtors { get; set; }
}

我进行了测试

  1. 我添加了一个Subdiv (TOSTER TM) 并获得了它的ID。
  2. 接下来,我添加了一个房地产经纪人并将Subdiv属性推到ID上,新创建的TOSTER TM Realtor.Subdiv 是一个类型为 Subdiv 的对象。好的。 enter image description here

  3. 然后我尝试从数据库中选择新添加的房地产经纪人。 Realtor.Subdiv = null 天哪! enter image description here

  4. 我们获取Subdiv对象,发现在上面的Realtor中缺少它,并看到他的List<Realtor> = null

enter image description here

请帮助解决这个问题。

3个回答

5

试试这个:

Relator rl = Context.Relators.Include(r => r.Subdiv).First(s => s.Id == id);

现在您可以访问Subdiv属性

如果需要更多相关数据,可以多次调用Include方法:

Relator rl = Context.Relators
                    .Include(r => r.Subdiv)
                    .Include(r => r.AnotherRel)
                    .First(s => s.Id == id);

对于具有多个深度级别的实体:

如果Subdir是一个集合

Relator rl = Context.Relators
                    .Include(r => r.Subdiv)
                    .ThenInclude(sub => sub.SecondLevelDepth)
                    .First(s => s.Id == id);

如果Subdir是一个实体。
Relator rl = Context.Relators
                    .Include(r => r.Subdiv.Select(s => s.SecondLevelDepth)
                    .First(s => s.Id == id);

包含房地产经纪人不存在。 - Dmitriy Gavrilenko
抱歉,我调用了错误的方法 :-))) Relators.Include(...).First(...) - Glauco Cucchiar
如果有两个或更多相关的数据怎么办? - Dmitriy Gavrilenko

4
问题不在于保存相关数据(应该已经正确保存,您可以在数据库中检查),而在于加载它。
EF Core目前不支持延迟加载,因此为了获取相关数据,您需要显式请求它(所谓的急切加载):
Realtor rl = context.Realtors.Include(r => r.Subdiv).First(r => r.Id == id);

更多信息请参见EF Core: 加载相关数据


可以了!谢谢!也就是说,所有相关的数据只能通过这种方式获取? - Dmitriy Gavrilenko
同时也可以使用链接中描述的显式加载 - Ivan Stoev

1

Entity Framework Core 允许保存相关实体,您需要为主表和详细表定义 Fluent API 设置。

   public class Order     
   { 
        public int Id { get; set; }
        public int AddressId { get; set; }
        public string DeliveryNotes { get; set; }
        public int PurchaseOrderNo { get; set; }
        public virtual  ICollection<OrderItem> Items { get; set; }
     }

    public class OrderItem 
    {
        public int Id { get; set; }
        public string ProductName { get; set; }
        public int Quantity { get; set; }
        public decimal UserPrice { get; set; }
        public string Comment { get; set; }    
        [ForeignKey("OrderId ")]
        public int OrderId { get; set; }    
        public virtual Order Order { get; set; }
     }

在DBContext的OnModelCreating方法中,定义关系,这将确保当您有订单对象时,其相关或子对象即Enrolments也将被保存。
modelBuilder.Entity<Order>()
                .HasMany(c => c.Items)
                .WithOne(e => e.Order);
modelBuilder.Entity<OrderItem>().Ignore(x => x.Order);

现在你的代码应该长这样。
 Order _order = new Order{ AddressId = 1, DeliveryNotes ="some notes", PurchaseOrderNo =1};
 _order.Items = new List< OrderItem>();
 _ordert.Items.add(new OrderItem{ ProductName =”Laptop”, Quantity =1, UserPrice =1500.00, Comment =some testing comments”});
 repository.order.insert(_order); 
 repository.save();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接