我正在处理一个涉及遗留数据库模式的项目,并且在尝试使用实体框架(v6)加载相关实体时遇到了问题。这里是正在使用的数据模型的一个简单的例子:在实体框架中没有显式外键的负载相关实体
public partial class Product {
public virtual Delivery Delivery { get; set; }
public virtual string OrderNumber { get; set; }
public virtual int? VersionNumber { get; set; }
public virtual string SocialNumber { get; set; }
}
public partial class Delivery {
public virtual string OrderNumber { get; set; }
public virtual int? VersionNumber { get; set; }
public virtual string SocialNumber { get; set; }
}
我试图实现与给定SocialNumber
检索的Product
秒的名单时,包括相关的Delivery
。当满足以下条件时,Delivery
与Product
相关:product.OrderNumber == delivery.OrderNumber && product.VersionNumber == delivery.OrderNumber && product.SocialNumber == delivery.SocialNumber
。
最简单的方法是打电话Include
。然而,由于EF声称product.Delivery
不是有效的导航属性,所以这似乎是不可能的。我试图通过投影来获得想要的结果,但失败了。如果有人能解释最好的EF/LINQ方法来获得Product
s(+他们的相关Delivery
)与给定的SocialNumber
,我会很感激。
更新:我想我应该阐述一些。
主要问题是我正在处理的遗留数据库没有显式(复合)键在每个表上。例如,Delivery
和Product
类映射到没有主键的表。因为EF需要主键,虚设键被定义如下:
dbModelBuilder.Entity<Product>().hasKey(pk => new { pk.OrderNumber });
实体类是由码发生器产生,所以添加注释没有我正在寻找解决方案。我想应该可以通过DbModelBuilder来定义这些东西,但我不知道如何去做。
更新:想出一个解决方案。
预期(只显示LINQ查询应提供产品的对和相关交货)以下查询功能:
from data in _dartz3Context.V_VOV_GBA_DATAs
join delivery in _dartz3Context.VOV_GBA_AANLEVERINGs
on new { Bsn = data.MunicipalBasicAdministrationSocialSecurityNumber, Version = data.VersionNumber, PolicyNumber = data.InsurancePolicyNumber }
equals new { Bsn = delivery.MunicipalBasicAdministrationSocialSecurityNumber, Version = delivery.VersionNumber, PolicyNumber = delivery.InsurancePolicyNumber }
where data.MunicipalBasicAdministrationSocialSecurityNumber == socialSecurityNumber
select new { Data = data, Delivery = delivery }
在EF模型中添加导航属性。缺少正确的外键并不妨碍您在模型中创建导航属性。 –
是不是''Product.Delivery''已经是一个导航属性? –
由于缺少外键,您可能需要指定组成关系的关键字。鉴于它是一个多部分的密钥,我不确定这会起作用,但可以尝试在标识“OrderNumber”,“VersionNumber”和“SocialNumber”的'Delivery'属性中添加三个'[ForeignKey]'属性作为外键。 –