这是一个现有的。NET Core 3.1项目。
我有一个类引用了数据库表
public class SupportContract
{
public int Id { get; set; }
public DateTime StartDate { get; set; }
public int SupportContractStatusId { get; set; }
public virtual SupportContractStatus SupportContractStatus { get; set; }
}
以及具有外键的子表
public class SupportContractStatus
{
public int Id { get; set; }
public string SupportContractStatusName { get; set; }
}
这很好,我可以得到
supportContract.SupportContractStatus.SupportContractStatusName
但如果我在C#和数据库中将SupportContractStatusId
重命名为ContractStatusId
;SupportContractStatusId丢失";。
我在代码中的任何地方都找不到列SupportContractStatusId
和表SupportContractStatus
之间的任何链接,也没有提到外键。
DbContext
中也没有链接。
实体框架是否采用了这种命名约定?框架如何知道外键?
是的,EF默认期望的命名约定基于类名,而不是属性名。它将查找ClassNameId或ClassName_Id。可以通过注释或配置链接FK。
即
public int ContractStatusId { get; set; }
[ForeignKey("ContractStatusId")]
public virtual SupportContractStatus ContractStatus { get; set; }
配置是通过IEntityTypeConfiguration
实现或通过在DbContext中实现OnModelCreating
方法并在modelBuilder中配置关系来完成的。对于偶尔偏离惯例的情况,属性方法通常可以涵盖所有内容。