![](/img/trans.png)
[英]Self-referencing many to many relation in Entity Framework Core
[英]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.