從EF Core RC2升級到V1時,外鍵引用相同的表異常

entity-framework-core

希望這只是一個簡單的,但我剛剛升級到EF核心的發布版本,不能再對DB運行任何代碼。

我有2個表,一個客戶端表和一個語言表。客戶端有兩個語言表引用,一個用於語言,另一個用於語言。所以語言有

public ICollection<Client> Clients { get; set; }

而客戶有

public Language Language { get; set; }
private int? _languageId;

public int? LanguageId
{
    get
    {
        if (_languageId != 0)
            return _languageId;
        if (Language != null)
            return Language.LanguageId;
        return null;
    }
    set { _languageId = value; }
}

public Language LanguageAtHome { get; set; }
private int? _languageAtHomeId;

public int? LanguageAtHomeId
{
    get
    {
        if (_languageAtHomeId != 0)
            return _languageAtHomeId;
        if (LanguageAtHome != null)
            return LanguageAtHome.LanguageId;
        return null;
    }
    set { _languageAtHomeId = value; }
}

在我的OnModelCreating中我有以下兩行

modelBuilder.Entity<Client>().HasOne(m => m.LanguageAtHome).WithMany(m => m.Clients).HasForeignKey(p => p.LanguageAtHomeId).HasConstraintName("ForeignKey_Client_LanguageAtHome");
modelBuilder.Entity<Client>().HasOne(m => m.Language).WithMany(m => m.Clients).HasForeignKey(p => p.LanguageId).HasConstraintName("ForeignKey_Client_Language");

我查看了RC2到V1的升級文檔,但沒有說明對此的更改。 https://docs.efproject.net/en/latest/miscellaneous/rc2-rtm-upgrade.html

例外是:

System.InvalidOperationException: Cannot create a relationship between 'Language.Clients' and 'Client.Language', because there already is a relationship between 'Language.Clients' and 'Client.LanguageAtHome'. Navigation properties can only participate in a single relationship.

我試過把它倒轉到

modelBuilder.Entity<Language>().HasMany(l => l.Clients).WithOne(c => c.LanguageAtHome).HasForeignKey(k => k.LanguageAtHomeId).HasConstraintName("ForeignKey_Client_LanguageAtHome");
modelBuilder.Entity<Language>().HasMany(l => l.Clients).WithOne(c => c.Language).HasForeignKey(k => k.LanguageId).HasConstraintName("ForeignKey_Client_Language");

但我得到完全相同的錯誤。

在git hub上查看EF源代碼,我將錯誤追溯到此變更集https://github.com/aspnet/EntityFramework/commit/5765564bc4dc55f9acb1716a1f5b40a8f8b0b399中的內部關係構建器行2145。

我的預感是RC2和V1之間發生了這種變化。

我的問題是我做錯了什麼,或者這是一個已經引入的錯誤?

更新 - 解答感謝Andriy

我將我的語言類更改為擁有2個客戶端集合

public ICollection<Client> LanguageAtHomeClients { get; set; }
public ICollection<Client> LanguageClients { get; set; }

並修改了OnModelCreating中的關係

modelBuilder.Entity<Client>().HasOne(m => m.LanguageAtHome).WithMany(m => m.LanguageAtHomeClients).HasForeignKey(p => p.LanguageAtHomeId).HasConstraintName("ForeignKey_Client_LanguageAtHome");
modelBuilder.Entity<Client>().HasOne(m => m.Language).WithMany(m => m.LanguageClients).HasForeignKey(p => p.LanguageId).HasConstraintName("ForeignKey_Client_Language"); 

我剛剛升級到EF Core V1,這一切都很有效!

一般承認的答案

由於異常狀態,導航屬性只能是一個關係的一部分。在RC2中,EF會默默地用第二個替換第一個,但在RTM中,它會提醒您注意這個事實。你應該創建另一個屬性,比如說ClientsAtHome用於另一個屬性。


熱門答案

https://stackoverflow.com/a/44574378/3855971中以多對多的關係引用第二個集合併不是強制性的。



Related

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