在实体框架中没有显式外键的渴望加载相关实体

时间:2015-05-12 13:44:14

标签: c# entity-framework

我正在开发涉及遗留数据库模式的项目,并且在尝试使用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。满足以下条件时,SocialNumberDelivery相关:Product

最简单的方法是调用product.OrderNumber == delivery.OrderNumber && product.VersionNumber == delivery.OrderNumber && product.SocialNumber == delivery.SocialNumber。但是,这似乎是不可能的,因为EF声明Include不是有效的导航属性。我试图通过投影获得想要的结果,但失败了。如果有人能解释最好的EF / LINQ方法来获得product.Delivery s(+与他们相关的Product)列表给定的Delivery,我会感激不尽。

更新:我想我应该详细说明一下。

主要问题是我正在处理在每个表上没有显式(复合)键的遗留数据库。例如,SocialNumberDelivery类映射到没有主键的表。由于EF需要主键,因此虚拟键定义如下:

Product

实体类是由代码生成器生成的,因此添加注释并不是我正在寻找的解决方案。我想应该可以通过DbModelBuilder来定义这些东西,但我不知道该怎么做。

更新:找出解决方案。

以下查询按预期运行(仅显示应提供产品和相关交付对的LINQ查询):

dbModelBuilder.Entity<Product>().hasKey(pk => new { pk.OrderNumber });

1 个答案:

答案 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 });