我正在嘗試更改我的產品以使用代碼而不是類別。實現標籤非常簡單,但只要我從產品模型中刪除類別,我就開始發現錯誤。刪除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'