我在.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
}
任何人都可以对设置此功能的最佳方法提供一些见识吗?
谢谢!
答案 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)的现有数据库时,显式配置非常有用。这使您可以使代码更具可读性,而不必担心属性名称的怪异。 :)