2013-08-23 98 views
0

我正在尝试更改我的产品以使用代码而不是类别。实现标签非常简单,但只要我从产品模型中删除类别,我就开始发现错误。删除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); 
} 

这是所有工作的罚款,我得到了我的DB下表:

  • BaseProducts
  • 分类
  • PackageRelations
  • 产品
  • ProductTags
  • 标签

但是,如果我编辑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:被引用的EntitySet 'BaseProduct' 的结束 'BaseProduct'在包含的EntityContainer中找不到。 BaseProduct::在包含的EntityContainer中找不到结束'BaseProduct'的引用EntitySet'BaseProduct'

回答

0

我想明白了。我得到了错误,因为我删除了构建BaseProduct模型的模型构建器的一部分。我不知道这是必需的,但我改变

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); 

,然后它再

工作