首先在EF代码中删除列

因雷戈

我正在尝试将我的产品更改为使用标签而不是类别。实施标签非常容易,但是一旦我从产品模型中删除了类别,我就会开始出错。

简而言之,我有以下课程:

public class BaseProduct
{
    public int ID {get; set;}
    public int CategoryID {get;set;}
    public virtual Category Category {get;set;}
    public virtual ICollection<ProductTag> Tags {get;set;}
}

[Table("Products")]
public class Product : BaseProduct
{
    public string ImageUrl {get;set;}
}

[Table("Packages")]
public class Package : BaseProduct
{
    public virtual ICollection<Product> Products {get;set}
}

public class Category
{
    public int CategoryID {get;set;}
    public string CategoryName {get;set;}
    public int ParentID {get;set;}
    public virtual Category Parent {get;set;}
    public virtual ICollection Products {get;set;}
}

public class ProductTag
{
    [Key, Column(Order = 0)]
    public int ProductId {get;set;}

    [Key, Column(Order = 1)]
    public string TagName {get;set;}

    public virtual BaseProduct Product {get;set;}

    public virtual Tag Tag {get;set;}
}

public class Tag
{
    [Key]
    public string Name {get;set;}

    public virtual Collection<ProductTag> ProductTags {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");
            });
    modelBuilder.Entity<Category>()
                .HasOptional(c => c.Parent)
                .WithMany(c => c.Children)
                .HasForeignKey(c => c.ParentID);
    modelBuilder.Entity<BaseProduct>()
                .HasRequired(p => p.Category)
                .WithMany(c => c.Products)
                .HasForeignKey(p => p.CategoryID);
    modelBuilder.Entity<ProductTag>()
                .HasRequired(c => c.Product)
                .WithMany(c => c.Tags)
                .HasForeignKey(c => c.ProductId);
    modelBuilder.Entity<ProductTag>()
                .HasRequired(c => c.Tag)
                .WithMany(c => c.ProductTags)
                .HasForeignKey(c => c.TagName);
}

一切正常,我在数据库中获得了以下表格:

  • 基础产品
  • 分类目录
  • 包关系
  • 配套
  • 产品
  • 产品标签
  • 标签

但是,如果我编辑BaseProduct并删除类别ID和虚拟类别,则如下所示:

public class BaseProduct
{
    public int ID {get; set;}
    public virtual ICollection<ProductTag> Tags {get;set;}
}

并从以下类别中删除虚拟产品:

public class Category
{
    public int CategoryID {get;set;}
    public string CategoryName {get;set;}
    public int ParentID {get;set;}
    public virtual Category Parent {get;set;}
}

并从OnModelCreating中删除映射:

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");
            });
    modelBuilder.Entity<Category>()
                .HasOptional(c => c.Parent)
                .WithMany(c => c.Children)
                .HasForeignKey(c => c.ParentID);
    modelBuilder.Entity<ProductTag>()
                .HasRequired(c => c.Product)
                .WithMany(c => c.Tags)
                .HasForeignKey(c => c.ProductId);
    modelBuilder.Entity<ProductTag>()
                .HasRequired(c => c.Tag)
                .WithMany(c => c.ProductTags)
                .HasForeignKey(c => c.TagName);
}

然后,当我转到使用产品模型的页面时,出现以下错误:

说明:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。

异常详细信息:System.Data.Entity.ModelConfiguration.ModelValidationException:在模型生成期间检测到一个或多个验证错误:

BaseProduct::在包含的EntityContainer中找不到为终端'BaseProduct'引用的EntitySet'BaseProduct'。BaseProduct::在包含的EntityContainer中找不到最终“ BaseProduct”的引用EntitySet“ BaseProduct”

因雷戈

我想到了。我收到错误消息是因为删除了为BaseProduct构建模型的modelbuilder部分。我不知道这是必需的,但是我改变了

modelBuilder.Entity<ProductTag>()
            .HasRequired(c => c.Product)
            .WithMany(c => c.Tags)
            .HasForeignKey(c => c.ProductId);

modelBuilder.Entity<BaseProduct>()
            .HasMany(p => p.Tags)
            .WithRequired(t => t.Product)
            .HasForeignKey(t => t.ProductId);

然后它又开始工作了

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

首先在EF6代码中创建多对多关系

EF例外,如何首先在C#和实体框架代码中为地址建模

如何首先在EF6代码中设置唯一属性

首先在EF代码中设计一对多关系的最佳实践

如何首先在EF代码中建立模型与枚举之间的多对多关系?

首先在Entity Framework代码中链接子表

多个外键EF Core 2.1代码首先在数据库中仅生成1

EF代码首先在我定义的代码旁边添加它自己的FK

首先在实体框架代码中,要映射导航属性是否还需要映射外键列

首先在实体框架集列中编写代码以在SQL Server中键入datetime2

首先在抽象父EF代码上包含对象列表

LINQ-首先在EF代码中外部连接到父类

如何首先在代码中使用迁移添加计算列?

首先在实体框架代码中初始化数据库中的对象

首先在实体框架代码中为同一表定义多个外键

之后首先在Firebase云功能中执行代码

如何首先在实体框架代码中的 linq 中使用可为空列表?

首先在模型存储库MVC 4代码中验证会话变量

如何首先在Entity Framework代码中为Identity主键设置起始值?

如何首先在asp.net核心中的代码中创建关系

在AngularJS中完成Factory方法后,首先在范围内运行代码

如何首先在代码中保存外键的集合

如何首先在EF 7代码中使用数据注释指定唯一键

首先在mysqli中显示较新的数据

首先在设备上的iOS 9中与NSURLConnection连接

如何首先在Wicket中呈现<meta>标签?

首先在路由表中插入忽略的路由

首先在javascript中显示已加载的元素

替换所有捕获的组,但首先在 sed 中