gpt4 book ai didi

c# - Entity Framework 中没有显式外键的急切加载相关实体

转载 作者:太空宇宙 更新时间:2023-11-03 13:07:41 25 4
gpt4 key购买 nike

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

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

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


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


主要问题是我正在处理一个在每个表上都没有显式(复合)键的遗留数据库。例如,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 }

最佳答案

您需要使用注解或 Fluent 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com