簡體   English   中英

代碼優先:同一實體的一對多關系

[英]Code first: One to many relationship of the same entity

我有一個實體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");
    }
}

我在這里做錯了什么?

正如您在評論中所說:

一個產品可以是多個產品的附加產品。 並且還可以擁有其一套其他產品。

因此,首先制作一個名為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);
}

您的最佳解決方案是:

首先,為您的所有Aditional Productions新的班級

[Table("AdditionalProducts")]
public class AdditionalProduct
{
    [Key]
    public int Id { get; set; }

    public virtual ICollection<Product> AdditionalProducts { get; set; }
}

其次,與該類one-to-one建立relationship

[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; }
}

一對一查看更多

希望對您有用!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM