【发布时间】:2016-09-09 16:02:04
【问题描述】:
我遇到了与 Entity Framework 6.1.3 中的一对一关系相关的问题。
我有 2 节课。
public class Package
{
public Guid Id { get; set; }
public string PackageNo { get; set; }
public double SendingCost{ get; set; }
public virtual PackageAppointment PackageAppointment { get; set; }
}
public class PackageAppointment
{
public DateTime Date { get; set; }
public virtual Package Package { get; set; }
}
PackageAppointment 的地图类是:
public class PackageAppointmentMap
{
public PackageAppointmentMap()
{
Property(x => x.Date).IsRequired();
HasRequired(x => x.Package).WithOptional(x => x.PackageAppointment).Map(x => x.MapKey("PackageId"));
}
}
一切正常。我对这段关系没有任何问题。问题是查询数据库。每次我使用上下文查询数据库中的Package 实体时,SQL Server 分析器都会生成类似这样的内容。
LINQ 查询:
var data = await Task.Run(() => GenericService.GetAll().Select(x => x.PackageNo));
SQL Server 分析器:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[PackageNo] AS [PackageNo],
[Extent1].[SendingCost] AS [SendingCost],
[Extent2].[Id] AS [Id1]
FROM
[dbo].[Package] AS [Extent1]
LEFT OUTER JOIN
[dbo].[PackageAppointment] AS [Extent2] ON [Extent1].[Id] = [Extent2].[PackageId]
我使用context.Package... 执行的每个查询都没有从PackageAppointment(或任何其他一对一关系)实体框架中检索数据,都会生成一个左外连接。
我项目中的实际情况是Package实体有5个一对一的关系。因此性能非常低。
也许我应该改变这种关系或别的什么。真的我不知道如何解决这个性能问题。
请指教。
【问题讨论】:
-
PackageAppointment实体的PK在哪里? -
分离数据库中的模型有好处吗?就我个人而言,我尽量不在数据库中建立任何真正的一对一关系,因为这通常表明希望在概念上将其拆分为业务逻辑(代码)而不是持久层。
-
问题出在你的
GetAll方法上,能发一下吗? -
The actual condition in my project is that Package entity has 5 one to one relationships. The performance is very low because of this -
那么为什么我得到一个正确的 SQL 呢?可以提供minimal reproducible example吗?
标签: c# sql-server entity-framework linq