实体框架创建不需要的列

时间:2015-11-24 22:32:39

标签: entity-framework fluent-interface

我有一个项目类,其中包含:

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

我有一个包含以下内容的项目类:

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

我希望我的Items Table包含以下列: ItemID, ParentID, ItemName

但出于某种原因,它正在添加另一列ItemItemID

我尝试了一些流畅的API。 (WithOptional,MapKey等......)但我找不到适合我的东西。我认为问题是ParentID不被视为项目的关系。

请告诉我一个解决方案,因为我已经困住了几个小时......

1 个答案:

答案 0 :(得分:0)

实体框架无法推断ParentID属性实际上是同一个表中父Item个对象的外键,因此决定在数据库中为该属性创建一个特殊列。您必须使用ForeignKey属性告诉ParentID实际上是外键。

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属性需要指向显示父实体的属性。

如果您更喜欢使用Fluent API,则删除ForeignKey属性,并将上下文类中的OnModelCreating方法覆盖为以下内容:

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