[英]Entity Framework - Fluent APi - Create table with 2 FK
我有此產品類,其中包含相關的產品列表。
例如:
產品=星際大戰
Associated Products =第五集:帝國反擊,第六集:絕地歸來,第七集:原力覺醒
但是EF生成帶有一些額外列的數據庫。
這是我的產品類別:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string ShortDescription { get; set; }
public string FullDescription { get; set; }
public decimal UnitPrice { get; set; }
......
public virtual ICollection<AssociatedProducts> AssociatedProducts { get; set; }
......
}
這是我的關聯產品類別:
public class AssociatedProducts
{
public int Id { get; set; }
public int ProductId { get; set; }
public int AssociatedProductId { get; set; }
public int DisplayOrder { get; set; }
public DateTime CreatedOn { get; set; }
public virtual Product Products { get; set; }
public virtual Product AssociatedProductsId { get; set; }
}
這是我對AssocietedProduct類的映射:
public AssociatedProductsMap()
{
// Primary Key
HasKey(a => a.Id);
// Properties
Property(a => a.CreatedOn).IsRequired();
Property(a => a.ProductId).IsRequired();
Property(a => a.AssociatedProductId).IsRequired();
Property(a => a.DisplayOrder).IsRequired();
//Relationship
HasRequired(a => a.Products)
.WithMany(p => p.Products)
.HasForeignKey(a => a.ProductId)
.WillCascadeOnDelete(false);
HasRequired(a => a.AssociatedProductsId)
.WithMany(p => p.AssociatedProducts)
.HasForeignKey(a => a.AssociatedProductId)
.WillCascadeOnDelete(false);
//Table
ToTable("AssociatedProducts");
}
這就是我播種的方式:
var associetedProducts = new List<AssociatedProducts>
{
new AssociatedProducts {ProductId= 1, AssociatedProductId = 3, DisplayOrder = 1, CreatedOn = DateTime.Now},
new AssociatedProducts {ProductId= 1, AssociatedProductId = 4, DisplayOrder = 2, CreatedOn = DateTime.Now},
new AssociatedProducts {ProductId= 1, AssociatedProductId = 5, DisplayOrder = 3, CreatedOn = DateTime.Now}
}
new List<Product>
{
new Product {Name = "StarWar", ShortDescription = "...", FullDescription = "P.......", UnitPrice = 15m, AssociatedProducts = associetedProducts},
new Product {Name = "StarWar Episode V", ShortDescription = "...", FullDescription = "P.......", UnitPrice = 15m},
new Product {Name = "StarWar Episode VI", ShortDescription = "...", FullDescription = "P.......", UnitPrice = 15m},
new Product {Name = "StarWar Episode VII", ShortDescription = "...", FullDescription = "P.......", UnitPrice = 15m},
}.ForEach(a => context.Products.AddOrUpdate(a));
context.SaveChanges();
這是我對AssociatedProductsId表的期望:ID + ProductId(FK)+ AssociatedProductsId(FK)+日期+ ......
但這就是我得到的:
我的錯是什么? 這是關聯產品的好方法嗎?
我認為您的課程不正確。
1問題:為什么EF生成帶有額外列的表?
在這種情況下,EF使用的是TPH策略。 看一下此鏈接http://blogs.msdn.com/b/alexj/archive/2009/04/15/tip-12-choosing-an-inheritance-strategy.aspx
2問題:我的錯誤是什么? 這是關聯產品的好方法嗎?
您的映射應如下所示:
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public virtual ICollection<ProductAssociation> AssociatedProducts { get; set; }
public virtual ICollection<ProductAssociation> ProductsAssociatedThisProduct { get; set; }
}
public class ProductAssociation
{
public int ProductId { get; set; }
public int ProductAssociatedId { get; set; }
public DateTime CreationDate { get; set; }
public virtual Product Product { get; set; }
public virtual Product ProductAssociated { get; set; }
}
public class Context : DbContext
{
public Context() : base("Model2")
{
}
public DbSet<Product> Products { get; set; }
public DbSet<ProductAssociation> ProductsAssociations { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>()
.HasKey(i => i.ProductId);
modelBuilder.Entity<ProductAssociation>()
.HasKey(i => new {i.ProductId, i.ProductAssociatedId });
modelBuilder.Entity<Product>()
.HasMany(i => i.AssociatedProducts)
.WithRequired(i => i.ProductAssociated)
.HasForeignKey(i => i.ProductAssociatedId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Product>()
.HasMany(i => i.ProductsAssociatedThisProduct)
.WithRequired(i => i.Product)
.HasForeignKey(i => i.ProductId)
.WillCascadeOnDelete(false);
base.OnModelCreating(modelBuilder);
}
}
種子
var product1 = new Product() { Name = "StarWars", ProductId = 1 };
var product2 = new Product() { Name = "StarWars II", ProductId = 2 };
context.ProductsAssociations.AddOrUpdate(new ProductAssociation { Product = product1, CreationDate = DateTime.Now, ProductAssociated = product2 });
context.Products.AddOrUpdate(product1);
context.Products.AddOrUpdate(product2);
context.SaveChanges();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.