Сначала несколько внешних ключей, указывающих на одну и ту же таблицу в коде Entity Framework 4.1 - PullRequest
17 голосов
/ 16 мая 2011

Я застрял при попытке написать первую модель кода 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 ]

18 голосов
/ 16 мая 2011

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, какие пары свойств навигации принадлежат друг другу в отношении.

3 голосов
/ 08 июня 2013

В этом блоге приведен пример использования конфигураций Fluent API.

Несколько внешних ключей в одной таблице с использованием CodeFirst Entity Framework и Fluent API

modelBuilder.Entity<Branch>().HasOptional(b => b.PrimaryContact)         
            .WithMany(a => a.PrimaryContactFor).HasForeignKey(b=>b.PrimaryContactID);
...