2013-08-23 97 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); 

,然後它再

工作