EFコアRC2からV1へのアップグレード時に同じテーブル例外を参照する外部キー

entity-framework-core

質問

うまくいけば、これは単純なものですが、EFコアのリリース版にアップグレードしたばかりで、DBに対してコードを実行できなくなりました。

私は2つのテーブル、クライアントテーブルと言語テーブルがあります。クライアントには、言語テーブルと、自宅の言語用の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で私は次の2つのラインを持っています

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");

私はV1へのRC2のアップグレードのドキュメントを見てきましたが、これに変更については何も言いません。 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 iの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にアップグレードしました。

受け入れられた回答

例外として、ナビゲーションプロパティは1つの関係の一部にしかなりません。 RC2では、EFは最初のものを静かに2番目のものに置き換えますが、RTMではこの事実を知らせるために投げます。他の関係のためにClientsAtHomeという別のプロパティを作成する必要があります。


人気のある回答

2番目のコレクションを多対多の関係で参照することは必須ではありません。https://stackoverflow.com/a/44574378/3855971を参照してください。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ