gpt4 book ai didi

c# - 如何使用 EF DbContext 对查找表建模

转载 作者:太空狗 更新时间:2023-10-30 01:09:44 26 4
gpt4 key购买 nike

我正在将 Entity Framwork DbContexts 与遗留数据库一起使用。我有一个实体的 2 个不同属性,它们都需要引用相同的查找表,如下所示:


public class Address
{
public virtual AddressType AnAddressType {get; set;}
public virtual AddressType AnotherAddressType {get; set;}
}

// now here's a LINQ query that just flat won't work:
from a in Addresses select a;

该异常表明我们试图在选择列表中包括一个完全虚构的字段——该字段没有出现在我的 POCO 或表中——它看起来像是约定俗成的,它被命名为 AnAddressType_AddressType 或类似的东西对那个

AddressType 实体没有对应的导航属性。我似乎无法让它工作。当我尝试使用 LINQ 查询选择数据时,出现运行时错误。

编辑

我还有其他有效的关系(此代码是从“stock”DbContext 生成器生成的)。这个关系的不同之处在于查找表没有返回主表的导航属性(查找表到处都在使用,所以我真的不想从中添加导航属性到使用它的一切)。 EF 似乎对此有疑问。这可能是配置与约定的问题,我无意中遇到了某种约定问题。

最佳答案

您的遗留数据库中有一个不遵循 EF 约定的外键列名称,例如:Addresses 表中的外键列到 AddressTypes AnAddressType 关系表的名称为 MyCrazyAnAddressTypeNumberCodeKeyId

但 EF 将按照约定假定 FK 列名称为:[Nav.property]_[KeyColumn]。例如:如果 AddressType 具有名称为 AddressTypeId 的 PK,EF 将假定 FK 列的名称为 AnAddressType_AddressTypeId。因为这不匹配,所以您会得到您描述的异常。您必须明确指定 FK 列名称才能解决此问题:

modelBuilder.Entity<Address>()
.HasRequired(a => a.AnAddressType)
.WithMany()
.Map(c => c.MapKey("MyCrazyAnAddressTypeNumberCodeKeyId"))
.WillCascadeOnDelete(false);

(为方便起见,从 Ladislav 的回答中部分窃取了代码片段)

这是我的假设。

编辑

或者,您可以在模型中引入一个外键属性,并通过数据注释告诉 EF 该属性是相应导航属性的外键:

public class Address
{
[ForeignKey("AnAddressType")]
public int MyCrazyAnAddressTypeNumberCodeKeyId {get; set;}
public virtual AddressType AnAddressType {get; set;}
}

关于c# - 如何使用 EF DbContext 对查找表建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6146079/

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