Несколько внешних ключей, указывающих на одну и ту же таблицу в коде Entity Framework 4.1, сначала

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

В идеале я хотел бы иметь возможность сохранять названия отношений.

Я предполагаю, что мне нужно установить некоторые атрибуты, но я не уверен, что установить.


person sf.    schedule 16.05.2011    source источник
comment
Возможный дубликат Entity Framework Code First - два внешних ключа из тот же стол   -  person Michael Freidgeim    schedule 02.08.2016


Ответы (2)


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

person Slauma    schedule 16.05.2011

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

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

modelBuilder.Entity<Branch>().HasOptional(b => b.PrimaryContact)         
            .WithMany(a => a.PrimaryContactFor).HasForeignKey(b=>b.PrimaryContactID);
person Desmond    schedule 08.06.2013
comment
Очень рад, что вы это разместили. Мне сегодня понадобился этот пример Fluent API. - person Brandon; 14.06.2013
comment
ИМХО лучший ответ. Беглый API ясен, как солнечный день. - person alex440; 02.10.2014