首先在Entity Framework 4.1代码中指向同一个表的多个外键

时间:2011-05-16 10:21:53

标签: entity-framework-4.1 code-first

我一直试图为以下数据库关系编写Entity Framework 4.1代码第一个模型。

以下是关系的视觉效果。enter image description here

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'.

理想情况下,我希望能够维持关系的命名。

我猜我需要设置一些属性,但我不确定要设置什么。

2 个答案:

答案 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);