Несколько внешних ключей, указывающих на одну и ту же таблицу в коде Entity Framework 4.1, сначала
Я застрял в попытке написать первую модель кода Entity Framework 4.1 для следующих отношений DB.
Вот визуальная связь. ![enter image description here]()
dbo. [Компании] могут иметь как Продавца, так и Должника как типы компаний.
dbo. [ПродавецDebtors] определяет соединение, которое компания-продавец имеет с компанией-должником.
Код, который я написал, основан на моем исходном коде модели 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'.
В идеале я хотел бы поддерживать именование отношений.
Я предполагаю, что мне нужно установить некоторые атрибуты, но я не уверен, что устанавливать.
Ответы
Ответ 1
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, какие пары свойств навигации принадлежат друг другу в отношении.
Ответ 2
В этом блоге приведен пример использования конфигураций Fluent API.
Несколько внешних ключей в одной таблице с использованием CodeFirst Entity Framework и Fluent API
modelBuilder.Entity<Branch>().HasOptional(b => b.PrimaryContact)
.WithMany(a => a.PrimaryContactFor).HasForeignKey(b=>b.PrimaryContactID);