![](/img/trans.png)
[英]Both One-To-One and One-To-Many relationships in Entity Framework 5 Code First
[英]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.