我正在处理一个涉及旧数据库架构的项目,当尝试使用Entity Framework(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; }
}
我想要实现的是在检索具有给定
Delivery
的Product
列表时包括相关的SocialNumber
。当满足以下条件时,Delivery
与Product
有关:product.OrderNumber == delivery.OrderNumber && product.VersionNumber == delivery.OrderNumber && product.SocialNumber == delivery.SocialNumber
。最简单的方法是调用
Include
。但是,这似乎是不可能的,因为EF指出product.Delivery
不是有效的导航属性。我试图通过使用投影来获得想要的结果,但是失败了。如果有人能解释最好的EF / LINQ方法以获得给定Product
的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 }
最佳答案
您需要使用注释或流利的api在实体上定义组合键:
public partial class Product {
[Key, Column(Order = 0)]
public virtual string OrderNumber { get; set; }
[Key, Column(Order = 1)]
public virtual int? VersionNumber { get; set; }
[Key, Column(Order = 2)]
public virtual string SocialNumber { get; set; }
}
public partial class Delivery {
[Key, Column(Order = 0), ForeignKey("Product")]
public virtual string OrderNumber { get; set; }
[Key, Column(Order = 1), ForeignKey("Product")]
public virtual int? VersionNumber { get; set; }
[Key, Column(Order = 2), ForeignKey("Product")]
public virtual string SocialNumber { get; set; }
}
示例http://www.codeproject.com/Articles/813912/Create-Primary-Key-using-Entity-Framework-Code-Fir
流利的API版本:
// Composite primary key
modelBuilder.Entity<Product>().HasKey(d => new { d.OrderNumber, d.VersionNumber, d.SocialNumber });
// Composite foreign key
modelBuilder.Entity<Delivery>()
.HasRequired(c => c.Product)
.WithMany(d => d.Delivery)
.HasForeignKey(d => new { d.OrderNumber, d.VersionNumber, d.SocialNumber });
关于c# - Entity Framework 中没有显式外键的,与负载较早的实体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30192740/