2015-11-24 6 views
2

У меня есть класс проекта, который содержит:Entity Framework создает нежелательный столбец

int ProjectID; 
string ProjectName; 
List<Item> Items; 

У меня есть класс элементов, который содержит:

int ItemID; 
int? ParentID; // ID of Parent Item 
string ItemName; 
List<Item> Items; 

Я ожидаю, что мои товары Таблицы провести следующие столбцы: ItemID, ParentID, ItemName

Но по какой-то причине он добавляет еще одну колонку ItemItemID.

Я пробовал несколько вещей с плавным API. (WithOptional, MapKey и т. Д.) Но я не могу найти то, что работает для меня. Я думаю, проблема заключается в том, что ParentID не рассматривается как отношение для элемента.

Пожалуйста, покажите мне решение, потому что я уже застрял в течение нескольких часов ...

ответ

0

Entity Framework не может сделать вывод о том, что ParentID свойство на самом деле внешний ключ к объекту родительского Item в той же таблице, так он решил создать специальный столбец для этой базы данных. Вы должны сказать, что ParentID фактически является внешним ключом, используя атрибут ForeignKey.

Изменить определение Item класса что-то вроде этого:

public class Item 
{ 
    public Item() 
    { 
     Items = new HashSet<Item>(); 
    } 

    public int ItemID { get; set; } 
    [ForeignKey("Parent")] 
    public int? ParentID { get; set; } // ID of Parent Item 
    public string ItemName { get; set; } 
    public virtual ICollection<Item> Items { get; set; } 
    public virtual Item Parent { get; set; } 
} 

как я добавил public virtual Item Parent свойство, поскольку атрибут ForeignKey необходимо указать на имущество, которое представляет родительский объект Примечание.

Если вы предпочитаете использовать свободно API, а затем удалить ForeignKey атрибут, и переопределить метод OnModelCreating на классе контекста, чтобы что-то вроде этого:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder 
     .Entity<Item>() 
     .HasMany(e => e.Items) 
     .WithOptional(e => e.Parent) 
     .HasForeignKey(e => e.ParentID); 
} 
+0

Спасибо Yacoub! Я реализовал ваш свободный API-пример и добавил публичный виртуальный элемент Parent {get; set;} в класс Item. Это имеет желаемый результат. – WHOSYS

Смежные вопросы