實體框架核心:與同一實體的多對多關係

asp.net c# entity-framework entity-framework-core

我試圖與同一個實體映射多對多關係。 User實體具有用於ContactsIList<User>數據字段,用於存儲用戶的聯繫人/朋友信息:

public class User : DomainModel
{
    public virtual IList<User> Contacts { get; protected set; }
    //irrelevant code omitted
}

當我嘗試使用流暢的API來映射這麼多對多的關係時,它給我帶來了一些麻煩。顯然,當我在user.Contacts屬性上使用HasMany()時,它沒有WithMany()方法來調用next。 Visual Studio中的intellisense僅顯示WithOne() ,但不顯示WithMany()

modelBuilder.Entity<User>().HasMany(u => u.Contacts).WithMany() 
// gives compile time error: CS1061 'CollectionNavigationBuilder<User, User>' does not contain a definition for 'WithMany' and no extension method 'WithMany' accepting a first argument of type 

那麼為什麼會這樣呢?有沒有什麼我做錯了映射這種多對多的關係?

熱門答案

那麼為什麼會這樣呢?有沒有什麼我做錯了映射這種多對多的關係?

不,你沒有做錯任何事。 它只是不受支持 。現狀在這裡

尚不支持沒有實體類來表示連接表的多對多關係。但是,您可以通過包含連接表的實體類並映射兩個單獨的一對多關係來表示多對多關係。

使用EF-Core,您應該為映射表創建實體。比如UserContacts 。如評論中所述, 文檔中的完整示例。我實際上沒有測試下面的代碼,但它應該看起來像這樣:

public class UserContacts
{
    public int UserId { get; set; } 
    public virtual User User { get; set; }

    public int ContactId { get; set; } // In lack of better name.
    public virtual User Contact { get; set; }
}

public class User : DomainModel
{
    public List<UserContacts> Contacts { get; set; }
}

和你的modelBuilder

  modelBuilder.Entity<UserContacts>()
        .HasOne(pt => pt.Contact)
        .WithMany(p => p.Contacts)
        .HasForeignKey(pt => pt.ContactId);

    modelBuilder.Entity<UserContacts>()
        .HasOne(pt => pt.User)
        .WithMany(t => t.Contacts)
        .HasForeignKey(pt => pt.UserId);


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因