[英]How to create many to many relation with EF when using generic
我有一個名為 Entity 的抽象 class 定義如下:
public abstract class Entity<T> : IEntity<T>
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public T Id { get; set; }
..
}
這里有幾個我正在使用的數據實體類:
public class Company : Entity<Guid>
{
...
}
public class User : Entity<Guid>
{
...
}
默認情況下,實體將為這兩個類提供一個 Id 屬性,在本例中為 Guid 類型,並且我使用流利的 API 的配置為每個類在創建相關表時使用更相關的名稱重命名 Id 屬性. 比如對於我公司的配置
this.HasKey(u => u.Id)
.Property(p => p.Id)
.HasColumnName("CompanyId")
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
到目前為止一切順利,一切都按預期工作,但我的要求已經改變,我現在需要在公司和用戶之間創建多對多關系,所以我嘗試在我的OnModelCreating
方法中定義關系:
modelBuilder.Entity<Company>()
.HasMany(s => s.Users)
.WithMany(c => c.Companies)
.Map(cs =>
{
cs.MapLeftKey("UserRefId");
cs.MapRightKey("CompanyRefId");
cs.ToTable("CompanyUsers");
});
但是當我嘗試更新我的數據庫時,我收到以下錯誤:
Schema specified is not valid. Errors: The relationship 'Data.Company_Users' was
not loaded because the type 'Data.Company' is not available.
如果我顛倒順序:
modelBuilder.Entity<User>()
.HasMany(s => s.Organizations)
.WithMany(c => c.Users)
.Map(cs =>
{
cs.MapLeftKey("OrganizationRefId");
cs.MapRightKey("UserRefId");
cs.ToTable("OrganizationUsers");
});
我收到以下錯誤:
在 model 生成期間檢測到一個或多個驗證錯誤:
CompanyId: : 在角色“User_Companies_Target”引用的類型中沒有定義名稱為“CompanyId”的屬性。 User_Companies_Source::多重性在關系“User_Companies”中的角色“User_Companies_Source”中無效。 主要角色多重性的有效值為“0..1”或“1”。
當我的實體從抽象 class 繼承並且它們都沒有在各自的 class 中定義的 UserId 或 CompanyId 時,我如何解決這個問題的任何想法,因為兩者都從抽象 ZA2F2ED4F8EBC2CBB4C21A29DC40 繼承 Id 屬性,並且僅在生成表時重命名和重命名 DZAB .
我希望以上是有道理的。 如果沒有,請告訴我,我會盡力澄清。
謝謝
我最終發現了問題所在:我愚蠢地留下了已經在用戶和公司實體中定義的現有外部關系:
在公司實體中:
this.HasMany(u => u.Users)
.WithRequired(o => o.Company)
.HasForeignKey(o => o.CompanyId);
在用戶實體中:
this.HasRequired(u => u.Company)
.WithMany(u => u.Users)
.HasForeignKey(s => s.CompanyId);
一旦我刪除了這些並使用:
modelBuilder.Entity<User>()
.HasMany(s => s.Companies)
.WithMany(c => c.Users)
.Map(cs =>
{
cs.MapLeftKey("CompanyRefId");
cs.MapRightKey("UserRefId");
cs.ToTable("CompanyUsers");
});
當我創建遷移時,它按預期工作並生成了相關腳本:
CreateTable(
"dbo.CompanyUsers",
c => new
{
CompanyRefId = c.Guid(nullable: false),
UserRefId = c.Guid(nullable: false),
})
.PrimaryKey(t => new { t.CompanyRefId, t.UserRefId })
.ForeignKey("dbo.Users", t => t.CompanyRefId, cascadeDelete: true)
.ForeignKey("dbo.Companies", t => t.UserRefId, cascadeDelete: true)
.Index(t => t.CompanyRefId)
.Index(t => t.UserRefId);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.