首页 > 解决方案 > EF Core 对同一实体的多次引用

问题描述

我在 .NET Core 2.1.12 设置中有一个组织实体和地址实体。一个组织有 0 或 1 个 PrimaryAddress 和 0 或 1 个 BillingAddress,两者都是 Address 类型。我正在努力尝试多种不同的方法。

这两个链接看起来都很有希望,但都是针对一个实体的 ICollection<>(好像有多个可能的帐单地址而不是 0 或 1),而不是单个实体,我似乎无法超越。我也尝试过 [InverseProperty] 属性,但没有成功。

https://www.entityframeworktutorial.net/code-first/inverseproperty-dataannotations-attribute-in-code-first.aspx 实体框架代码优先 - 来自同一个表的两个外键

我认为我对此的一个旁注是,Address 的复数是 Address es(“ES”不仅仅是一个“S”),并且不确定这是否与任何基于命名约定的内置功能相混淆。

public class Organization : Trackable
{
    [Required]
    public int OrganizationId { get; set; }

    [Required]
    [MaxLength(100)]
    public string OrganizationName { get; set; }

    // other scalar properties

    public int PrimaryAddressId { get; set; }
    public virtual Address PrimaryAddress { get; set; }

    public int BillingAddressId { get; set; }
    public virtual Address BillingAddress { get; set; }
}

public class Address : Trackable
{
    [Required]
    public int AddressId { get; set; }

    [Required]
    [MaxLength(100)]
    public string Street1 { get; set; }

    // other scalar properties
}

任何人都可以提供一些关于设置它的最佳方法的见解吗?

谢谢!

标签: entity-framework.net-core

解决方案


看起来您一直在依赖 EF 的约定来解析模型的架构。这适用于基本的东西,但魔法并不能涵盖一切。要拥有对同一实体类型的两个引用,您需要显式配置 FK:

[ForeignKey("PrimaryAddress")]
public int PrimaryAddressId { get; set; }
public virtual Address PrimaryAddress { get; set; }

[ForeignKey("BillingAddress")]
public int BillingAddressId { get; set; }
public virtual Address BillingAddress { get; set; }

使地址表“地址”(我相信 EF 可能会自动执行此操作,但为了安全,显式配置)

[Table("Addresses")]
public class Address
{
   // ...
}

IEntityTypeConfiguration<T>使用属性和/或(EF Core) 或 OnModelCreating DbContext 事件来熟悉实体的显式配置是值得的。我倾向于默认为显式配置,以避免在 EF 出现并对某些事情不满意时出现意外。

在将 EF 连接到具有不友好命名约定(如 ALL_CAPS_UNDERSCORE_FTW)的现有数据库时,显式配置非常有用。这使您可以使您的代码更具可读性,而不会出现属性名称的那些怪物。:)


推荐阅读