如何防止Entity Framework将类映射到数据库表

时间:2015-06-27 20:22:01

标签: asp.net asp.net-mvc entity-framework

我创建了一个viewmodel,它具有对实体类型的引用。

这是我的viewmodel:

namespace SuperMart.Areas.Admin.ViewModels
{
    [NotMapped]
    public class ProductDetailVM
    {
        public int ProductID { get; set; }
        [Display(Name = "Name")]
        public string ProductName { get; set; }
        [Display(Name = "Price")]
        public double Price { get; set; }
        [Display(Name = "Description")]
        public string Description { get; set; }

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

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

        [Display(Name = "Status")]
        public bool Available { get; set; }

        [Display(Name = "Date Created")]
        public DateTime? DateCreated { get; set; }
        public virtual ICollection<ProductImages> ProductImages { get; set; }
    }
} 

viewmodel引用的实体类型:

namespace SuperMart.Entities
{
    public class ProductImages
    {
        [Key]
        public int ImageID { get; set; }

        public byte[] ImageContent { get; set; }
        public string ImageContentType { get; set; }
        public string ImageName { get; set; }
        public FileType FileType { get; set; }

        [ForeignKey("Product")]
        public int ProductID { get; set; }

        public virtual Product Product { get; set; }
    }
}

我用[NotMapped]属性标记了类,说我不希望它成为数据库表,因为它只是一个视图模型而不是实体类型。但是,当我运行add-migration命令然后导致外键冲突时,EF仍在尝试将其创建为表。我尝试了modelBuilder.Ignore,但是单向或其他EF似乎忽略了该代码,因为它仍然将表创建为一个表,如下所示。

public override void Up()
{
    CreateTable(
                "dbo.ProductDetailVMs",
                c => new
                    {
                        ProductID = c.Int(nullable: false, identity: true),
                        ProductName = c.String(),
                        Price = c.Double(nullable: false),
                        Description = c.String(),
                        SubCat = c.String(),
                        Category = c.String(),
                        Available = c.Boolean(nullable: false),
                        DateCreated = c.DateTime(),
                    })
                .PrimaryKey(t => t.ProductID);

            AddForeignKey("dbo.ProductImages", "ProductID", "dbo.ProductDetailVMs", "ProductID", cascadeDelete: true);
        }

1 个答案:

答案 0 :(得分:1)

通常,要映射实体,您需要在DbContext中包含DbSet属性。 - Martin Liversage

好吧,事实证明我有点自己在腿上。我发现该类存在于我的DbContext类中,因此映射存在问题。但我必须承认,我真的不知道它是怎么到那里的。无论如何问题已经解决了。