2013-07-19 2 views
0

Этот вопрос является обобщением моего предыдущего вопроса:Ошибка в LINQ (столбец не существует) при использовании Entity Framework

Error in LINQ when work with PostGreSQL by Entity Framework
У меня есть предположение, что, если между 2 таблицы существуют более 1 соотношение (7 для моего примера), EF попытается нормализовать эту таблицу, добавив дополнительный столбец.

Например, модель А:

public partial class a 
{   
    [Key] 
    public int id { get; set; } 

    [ForeignKey("contractors"), Column(Order = 0)] 
    public Nullable<int> ot_contractor_id { get; set; } 

    [ForeignKey("contractors1"), Column(Order = 1)] 
    public Nullable<int> gvo_contractor_id { get; set; } 

    public virtual contractors contractors { get; set; } 
    public virtual contractors contractors1 { get; set; }  
} 

Таблица [а] имеет отношение к таблице [подрядчики] [ID] Таким образом, EF генерируют столбец "contractors_id" и "contractors1_id"..

Другие таблицы имеют только 1 отношение, и они работают нормально!

Вопрос: Правильно ли эта гипотеза ?! И проблема избыточного столбца исходит из ненормальных таблиц с несколькими отношениями? Спасибо!

ответ

1

Это может произойти, если у вас есть обратные навигационные свойства в contractors классе, например, так:

public partial class contractors 
{ 
    //... 

    public virtual ICollection<a> aCollection { get; set; } 
    public virtual ICollection<a> aCollection1 { get; set; } 
} 

В этом случае EF не будет знать, какой из них принадлежит к какому навигационному свойству в классе a и предположит, четыре отношения вместо из двух (или трех вместо двух, если у вас есть только одна коллекция). Эти дополнительные отношения будут иметь отдельный внешний ключ, а один из них - contractors_id. Если этого не существует в базе данных, вы получаете исключение.

Вы можете решить эту проблему путем применения атрибута InverseProperty в классе a:

[InverseProperty("aCollection")] 
public virtual contractors contractors { get; set; } 
[InverseProperty("aCollection1")] 
public virtual contractors contractors1 { get; set; } 
+0

Спасибо за ваш ответ! Я попробую это завтра! Я расскажу о результатах. – Oleg

+0

Спасибо! Это действительно работает! – Oleg