代码优先:同一实体的一对多关系

时间:2019-07-16 07:13:47

标签: c# entity-framework

我有一个实体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");
    }
}

我在这里做什么错了?

2 个答案:

答案 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; }
}

See more one-to-one

希望对您有用!