我一直试图为以下数据库关系编写Entity Framework 4.1代码第一个模型。
以下是关系的视觉效果。
dbo。[公司]可以将卖方或债务人作为公司类型。
dbo。[SellerDebtors]定义卖方公司与债务公司的关系。
我编写的代码基于我原来的EF 4.0 POCO型号代码。这就是我提出的 - 这段代码不起作用。
public class SellerDebtor
{
public int SellerDebtorId { get; set; }
public int DebtorCompanyId { get; set; }
public int SellerCompanyId { get; set; }
public Company DebtorCompany { get; set; }
public Company SellerCompany { get; set; }
public ICollection<SellerDebtorInfo> SellerDebtorInfos { get; set; }
public ICollection<SellerDebtorFile> SellerDebtorFiles { get; set; }
}
public class Company
{
public int CompanyId { get; set; }
public string CompanyType { get; set; }
public string Name { get; set; }
public virtual ICollection<User> Users { get; set; }
public virtual ICollection<CompanyInfo> CompanyInfos { get; set; }
public virtual ICollection<CompanyFile> CompanyFiles { get; set; }
public virtual ICollection<SellerDebtor> SellerDebtorDebtorCompanies { get; set; }
public virtual ICollection<SellerDebtor> SellerDebtorSellerCompanies { get; set; }
}
目前,我将此视为错误:
System.Data.SqlClient.SqlException: Invalid column name 'DebtorCompany_CompanyId'.
Invalid column name 'SellerCompany_CompanyId'.
Invalid column name 'Company_CompanyId'.
Invalid column name 'Company_CompanyId1'.
理想情况下,我希望能够维持关系的命名。
我猜我需要设置一些属性,但我不确定要设置什么。
答案 0 :(得分:18)
EF无法按惯例确定您的2个类的哪些导航属性属于一起并创建4个关系(在另一侧没有结束)而不是2个(两端都有结尾)。当您在同一个类中有多个相同类型的导航属性(在您的情况下为Company
)时,始终会出现此问题。您可以尝试通过以下方式解决此问题:
public class SellerDebtor
{
public int SellerDebtorId { get; set; }
[ForeignKey("DebtorCompany")]
public int DebtorCompanyId { get; set; }
[ForeignKey("SellerCompany")]
public int SellerCompanyId { get; set; }
[InverseProperty("SellerDebtorDebtorCompanies")]
public Company DebtorCompany { get; set; }
[InverseProperty("SellerDebtorSellerCompanies")]
public Company SellerCompany { get; set; }
public ICollection<SellerDebtorInfo> SellerDebtorInfos { get; set; }
public ICollection<SellerDebtorFile> SellerDebtorFiles { get; set; }
}
[InverseProperty(...)]
定义了关系另一端的导航属性,它明确地告诉EF哪些导航属性对在一个关系中。
答案 1 :(得分:3)
此博客的示例使用Fluent API配置。
Multiple foreign keys within same table using CodeFirst Entity Framework and Fluent API
modelBuilder.Entity<Branch>().HasOptional(b => b.PrimaryContact)
.WithMany(a => a.PrimaryContactFor).HasForeignKey(b=>b.PrimaryContactID);