簡體   English   中英

使用泛型時如何與 EF 創建多對多關系

[英]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.

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