我正在开发涉及遗留数据库模式的项目,并且在尝试使用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
的{{1}}列表时包含相关的Product
。满足以下条件时,SocialNumber
与Delivery
相关:Product
。
最简单的方法是调用product.OrderNumber == delivery.OrderNumber && product.VersionNumber == delivery.OrderNumber && product.SocialNumber == delivery.SocialNumber
。但是,这似乎是不可能的,因为EF声明Include
不是有效的导航属性。我试图通过投影获得想要的结果,但失败了。如果有人能解释最好的EF / LINQ方法来获得product.Delivery
s(+与他们相关的Product
)列表给定的Delivery
,我会感激不尽。
更新:我想我应该详细说明一下。
主要问题是我正在处理在每个表上没有显式(复合)键的遗留数据库。例如,SocialNumber
和Delivery
类映射到没有主键的表。由于EF需要主键,因此虚拟键定义如下:
Product
实体类是由代码生成器生成的,因此添加注释并不是我正在寻找的解决方案。我想应该可以通过DbModelBuilder来定义这些东西,但我不知道该怎么做。
更新:找出解决方案。
以下查询按预期运行(仅显示应提供产品和相关交付对的LINQ查询):
dbModelBuilder.Entity<Product>().hasKey(pk => new { pk.OrderNumber });
答案 0 :(得分:1)
您需要使用注释或流畅的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
Fluent 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 });