【问题标题】:EF Code First creating obsolete column?EF Code First 创建过时的列?
【发布时间】:2013-06-25 09:50:18
【问题描述】:

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

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、Author

表:包 列:ID

表:产品 列:ID、Category_CategoryID

我想知道的是,为什么它会在 products 表中创建 Category_CategoryID 列?当我填充表格时,该列中的所有值都是空的,所以看起来它没有被用于任何事情。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 这并没有解决问题。我在原始帖子中添加了更多信息,因为我发现了这个问题的另一个副作用。
    • 我建议使用另一个名为“PackageRelation”的具体类并添加对您的类的引用,而不是依赖 EF 来执行此操作。当然,如果有这种可能。我从经验中发现,多对多映射并非在所有情况下都能正常工作,如果您想添加排序等,添加单独的类可以提供更大的灵活性。
    • 这是我使用的第一种方法,但它并没有让我轻松访问相关对象(延迟加载的虚拟属性)。我看不出排序有多容易,你能举个例子吗?
    • 假设您需要以特定顺序显示包装的产品。使用自动生成的相交表时无法做到这一点。对于名为“PackageRelations”的新类,您只需添加一个名为“SortOrder”的新字段即可为您解决问题。
    【解决方案2】:

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

    当产品只有该类型的引用时,它会获得一个额外的列来引用该类别,这是有道理的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多