EF Code First创建过时的列?

时间:2013-06-25 09:50:18

标签: c# asp.net entity-framework ef-code-first

我有以下用于数据库的类:

public abstract class BaseProduct
{
    public int ID { get; set; }

    [Required, StringLength(100), Display(Name = "Name")]
    public string ProductName { get; set; }

    [Required, StringLength(10000), Display(Name = "Product Description"), DataType(DataType.MultilineText)]
    public string Description { get; set; }

    public string ImagePath { get; set; }

    [Display(Name = "Price")]
    public double? UnitPrice { get; set; }

    public int? CategoryID { get; set; }

    public virtual Category Category { get; set; }

    public string Author { get; set; }

    public virtual ICollection<PriceRelation> Prices { get; set; }
}
[Table("Packages")]
public class Package : BaseProduct
{
    public virtual ICollection<Product> Products { get; set; }
}
[Table("Products")]
public class Product : BaseProduct
{
    public virtual ICollection<Package> Packages { get; set; }
}
public class Category
{
    [ScaffoldColumn(false)]
    public int CategoryId { get; set; }

    [Required, StringLength(100), Display(Name = "Name")]
    public string CategoryName { get; set; }

    [Display(Name = "Category Description")]
    public string Description { get; set; }

    public int? ParentID { get; set; }
    [ForeignKey("ParentID")]
    public virtual Category Parent { get; set; }

    public virtual ICollection<Category> Children { get; set; } 

    public virtual ICollection<Product> Products { get; set; }

}

这是模型构建者:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Package>().HasMany(p => p.Products).WithMany(p => p.Packages)
            .Map(m =>
                {
                    m.ToTable("PackageRelations");
                    m.MapLeftKey("PackageID");
                    m.MapRightKey("ProductID");
                });
    }
    }

按照以下方式设置我想要的关系:

表:BaseProducts 列:ID,ProductName,Description,ImagePath,UnitPrice,CategoryID,作者

表:包裹 列:ID

表:产品 列:ID,Category_CategoryID

我想知道的是,为什么它会在products表中创建Column_CategoryID列?当我填充表时,此列中的所有值都为null,因此它看起来不像是用于任何事情。

此外,它似乎没有正确的关系 - 因为该类别上的产品的虚拟集合始终为空。

2 个答案:

答案 0 :(得分:0)

您可能需要将CategoryID重命名为CategoryId,以便EF可以将其识别为类别实体的关键字段。

答案 1 :(得分:0)

我明白了!类别中的虚拟ICollection是Product类型,实际上它应该是BaseProduct。

有意义的是,当产品只有该类型的引用时,Product会获得一个额外的列来引用Category。