我正在处理一个涉及旧数据库架构的项目,当尝试使用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; }
}


我想要实现的是在检索具有给定DeliveryProduct列表时包括相关的SocialNumber。当满足以下条件时,DeliveryProduct有关:product.OrderNumber == delivery.OrderNumber && product.VersionNumber == delivery.OrderNumber && product.SocialNumber == delivery.SocialNumber

最简单的方法是调用Include。但是,这似乎是不可能的,因为EF指出product.Delivery不是有效的导航属性。我试图通过使用投影来获得想要的结果,但是失败了。如果有人能解释最好的EF / LINQ方法以获得给定ProductDelivery(及其相关的SocialNumber)列表,我将不胜感激。



更新:我认为我应该详细说明。



主要问题是我要处理的遗留数据库在每个表上都没有显式(复合)键。例如,DeliveryProduct类被映射到没有主键的表。由于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/

10-09 07:40