簡體   English   中英

ASP.NET MVC 5實體框架6自引用一對多關系

[英]ASP.NET MVC 5 Entity Framework 6 Self-Referencing One-to-Many Relation

我有一個模型Package ,我想在其中添加一個集合屬性Dependencies ,其中的依賴關系只是另一個包(請考慮NuGet):

public class Package
{
    public Package()
    {
        Version = "0.0.0";
    }

    [ScriptIgnore]
    public int ID { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "Name cannot be longer than 100 characters.")]
    public string Name { get; set; }

    [Required]
    [StringLength(500, ErrorMessage = "Description cannot be longer than 500 characters.")]
    public string Description { get; set; }

    [Required]
    [StringLength(12, ErrorMessage = "Version is in an invalid format (Major.Minor.Build).")]
    public string Version { get; set; }

    [Required]
    [Column(TypeName = "DateTime2")]
    [DisplayName("Release Date")]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime ReleaseDate { get; set; }

    [ScriptIgnore]
    public string Filename { get; set; }

    [DisplayName("Published?")]
    [ScriptIgnore]
    public bool IsPublished { get; set; }

    public string ReleaseNotesURL { get; set; }

    [ScriptIgnore(ApplyToOverrides = true)]
    public virtual ICollection<Group> Groups { get; set; }

    [ForeignKey("Platform")]
    public int? PlatformID { get; set; }

    public virtual Platform Platform { get; set; }        

    public virtual ICollection<Package> Dependencies { get; set; } // <== THIS IS THE NEW PROPERTY
}

我正在使用自動遷移,因此Add-Migration AddDependendies生成以下類:

public partial class AddDependencies : DbMigration
{
    public override void Up()
    {
        AddColumn("dbo.Packages", "Package_ID", c => c.Int());
        CreateIndex("dbo.Packages", "Package_ID");
        AddForeignKey("dbo.Packages", "Package_ID", "dbo.Packages", "ID");
    }

    public override void Down()
    {
        DropForeignKey("dbo.Packages", "Package_ID", "dbo.Packages");
        DropIndex("dbo.Packages", new[] { "Package_ID" });
        DropColumn("dbo.Packages", "Package_ID");
    }
}

我閱讀了此架構更改,以作為對單個現有程序包的引用。 要創建多個包引用,將需要其他行,其中包含所有重復數據( Package_ID除外)。 在我看來,這似乎不太正確,或者,這僅僅是關系數據庫的局限性。

我們不能只將PackageID數組存儲在列中,還是使用其他不生成重復數據的機制?

您擁有的架構不能正確表示您要解決的問題。 由於多個程序包可能依賴於同一個程序包(即一切都取決於EF),因此您需要創建多對多關系。 EF中對m:m的支持受到一定限制,因此最簡單的方法是為依賴關系創建一個新實體(= table):您需要兩個字段(= columns)-一個用於依賴關系的父級,另一個用於依賴項的子級。

在這種情況下,EF無法為您解析映射,您將需要類似於以下內容的自定義映射:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Package>()
            .HasMany(p => p.Dependencies)
            .WithMany()
            .Map(m =>
            {
                m.MapLeftKey("Package_ID");
                m.MapRightKey("ID");
                m.ToTable("PackageDependency");
            });
}

這將指示EF生成DDL代碼以創建聯合表以存儲包之間的所有可能關系/依賴關系。

暫無
暫無

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

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