繁体   English   中英

实体框架一对一关系

[英]Entity Framework one-to-one relationships

我在了解如何使用实体框架核心为Web API属性设置一对一关系时遇到一些问题。

请考虑以下对象:

public class Car
{  
    [JsonIgnore]
    public Int32 CarId { get; set; }

    public virtual Horn Horn { get; set; }
    public virtual ICollection<Wheel> Wheels { get; set; }
}

public class Horn
{
    [JsonIgnore]
    public Int32 HornId { get; set; }
    public Sound Sound { get; set; }
}

public class Sound
{
    // some other props
}

当我在存储库中执行查询时,默认情况下不包括一对多,除非我使用.Include() ,但是,对于一对一属性,默认情况下在序列化时包括这些属性。

例如,它变得非常混乱,因为我查询了一辆汽车,并且它在JSON响应中返回了所有它的子组件。

我可以设置car.Horn = null ,等等,但是对于复杂对象来说似乎很难维护。 我希望它的功能类似于.Include() ,但默认情况下会被排除(以防我想查询完整的对象)。

编辑:注意,这个问题是递归的,汽车拉喇叭,拉声音。 在像用户表这样的真实示例中,除非专门取消子级属性,否则序列化时自动提取的数据非常庞大。

EDIT2:

这是存储库调用的示例,默认情况下会带回所有一对一属性:

var group = _context.Car.Include(c => c.Wheels).SingleOrDefault(u => u.CarId == id);

请注意,包含对多对一的预期工作,但即使删除了包含,此查询也将递归返回所有一对一的子对象。

确实在EF CORE 2.1中引入了某种类型的延迟加载

本文应该给您一个提示。 https://msdn.microsoft.com/zh-CN/library/jj574232(v=vs.113).aspx主要是:

关闭延迟加载以进行序列化

延迟加载和序列化不能很好地融合在一起,如果您不小心,可能会因为启用了延迟加载而最终查询整个数据库。 大多数序列化程序通过访问类型实例上的每个属性来工作。 属性访问触发延迟加载,因此更多实体被序列化。 在这些实体上访问属性,甚至加载更多实体。 在序列化实体之前,最好关闭延迟加载。 以下各节说明了如何执行此操作。

编辑:这是为所有实体禁用延迟加载的方法。 但是请注意,您必须通过多种方式实现此目的,因此请检查本文中的其他选项...

public class YourContext : DbContext 
{ 
    public YourContext() 
    { 
        this.Configuration.LazyLoadingEnabled = false; 
    } 
}

上下文映射

   modelBuilder.Entity<SessionFeedbackModel>(entity =>
        {
            entity.HasOne(s => s.Session).WithOne(p => p.Feedback)
                .HasForeignKey<SessionFeedbackModel>(s => s.SessionId).OnDelete(DeleteBehavior.Restrict);
        });

        modelBuilder.Entity<SessionQuestionModel>(entity =>
        {
            entity.HasOne(e => e.SessionResult).WithOne(e => e.SessionQuestion)
                .HasForeignKey<SessionQuestionResultModel>(e => e.SessionQuestionId)
                .OnDelete(DeleteBehavior.Restrict);

        });

楷模

   public class SessionQuestionResultModel
    {
        public int Id { get; set; }

        public int SessionQuestionId { get; set; }

        public SessionQuestionModel SessionQuestion { get; set; }
    }


    public class SessionFeedbackModel
    {
        public int Id { get; set; }
        public int SessionId { get; set; }

        public SessionModel Session { get; set; }

    }

EF Core 1.x或2.x不能很好地或根本不支持1:1,但是可以通过这种方式完成,这对于EF 6.xx来说是完全不同的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM