EF核心对同一实体的多个引用

时间:2019-09-15 20:23:49

标签: entity-framework .net-core

我在.NET Core 2.1.12设置中有一个Organization实体和Address实体。一个组织有0或1个PrimaryAddress以及0或1个BillingAddress,它们的类型均为Address。我正在尝试多种尝试的方法。

这两个链接都看起来很有希望,但是都用于实体的ICollection <>(好像有多个可能的帐单地址,而不是0或1),而不是单个实体,而且我似乎无法过去那。我也尝试过[InverseProperty]属性,但是没有运气。

https://www.entityframeworktutorial.net/code-first/inverseproperty-dataannotations-attribute-in-code-first.aspx Entity Framework Code First - two Foreign Keys from same table

一个旁注认为我对此也是因为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
}

任何人都可以对设置此功能的最佳方法提供一些见识吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

这似乎是您一直在依靠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)的现有数据库时,显式配置非常有用。这使您可以使代码更具可读性,而不必担心属性名称的怪异。 :)