我有一个实体Product
,它可以有多个其他产品。因此,我需要的是一个连接表,用于将Product
映射到其他Product
。
我试图做的是以下事情:
[Table("Product")]
public class Product : EntityBase
{
[Key]
public int Id { get; set; }
public virtual ICollection<Argument> Arguments { get; set; }
public virtual ICollection<Product> AdditionalProducts { get; set; }
}
添加一个产品集合,希望EF建立一个联结表。但是,在迁移过程中最终遇到了这个问题:
public partial class test1 : DbMigration
{
public override void Up()
{
AddColumn("dbo.Product", "Product_Id", c => c.Int());
CreateIndex("dbo.Product", "Product_Id");
AddForeignKey("dbo.Product", "Product_Id", "dbo.Product", "Id");
}
public override void Down()
{
DropForeignKey("dbo.Product", "Product_Id", "dbo.Product");
DropIndex("dbo.Product", new[] { "Product_Id" });
DropColumn("dbo.Product", "Product_Id");
}
}
我在这里做什么错了?
答案 0 :(得分:3)
如您在评论中所说:
一个产品可以是多个产品的附加产品。并且还可以提供其一组其他产品。
因此,首先创建一个名为AdditionalProduct
的模型类,如下所示:
[Table("AdditionalProduct")]
public class AdditionalProduct
{
[Key]
public int Id { get; set; }
public int ProductId {get; set;}
public int AdditionalProductId {get; set;}
public Product Product {get; set;}
public Product AdditionalProduct {get; set;}
}
您的Product
类应如下所示:
[Table("Product")]
public class Product : EntityBase
{
[Key]
public int Id { get; set; }
.......
public virtual ICollection<AdditionalProduct> HisAdditionalProducts { get; set; }
public virtual ICollection<AdditionalProduct> AdditionalProductsTo { get; set; }
}
然后在OnModelCreating
中进行如下操作:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<AdditionalProduct>()
.HasRequired(m => m.Product)
.WithMany(t => t.HisAdditionalProducts)
.HasForeignKey(m => m.ProductId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<AdditionalProduct>()
.HasRequired(m => m.AdditionalProduct)
.WithMany(t => t.AdditionalProductsTo)
.HasForeignKey(m => m.AdditionalProductId)
.WillCascadeOnDelete(false);
}
答案 1 :(得分:0)
最适合您的解决方案是:
首先,为您所有的Aditional Productions
[Table("AdditionalProducts")]
public class AdditionalProduct
{
[Key]
public int Id { get; set; }
public virtual ICollection<Product> AdditionalProducts { get; set; }
}
第二,为此课程创建一个relationship
one-to-one
[Table("Product")]
public class Product
{
[Key]
public int Id { get; set; }
public virtual ICollection<Argument> Arguments { get; set; }//your business
public int AdditionalProductsId { get; set; }
public virtual AdditionalProduct AdditionalProducts { get; set; }
}
希望对您有用!