entity-framework - 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
}
任何人都可以提供一些关于设置它的最佳方法的见解吗?
谢谢!
解决方案
看起来您一直在依赖 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)的现有数据库时,显式配置非常有用。这使您可以使您的代码更具可读性,而不会出现属性名称的那些怪物。:)
推荐阅读
- json - 解组 JSON 映射,其中键是非内置类型
- c++ - C++ Curl 无法使用 SSL_CTX_FUNCTION 的 LetsEncrypt pem 文件进行连接
- java - 如何在 j00q 中引用 Postgres 约束?
- mongodb - 如何在 ubuntu 15.10 上安装 Mongodb 4
- python - Python 中的效率:a = array[x][y] vs array[x][y]
- binary - 八度四舍五入和评估顺序
- excel - VBA PivotTable 和 PivotField - PivotField.CurrentPage 未更新
- c++ - boost::program_options: 是否可以将一个选项设置为另一个选项的默认值?
- php - 未定义的属性:stdClass - LARAVEL
- php - 如何修复(Curl PHP)中不允许的 405