2

データベースの作成に Code First アプローチを使用しています。Shared primary keyここでは、アプローチを使用して 1 対 1 の関係を実装しようとしています。

public partial class AccountHolder
{
    public int AccountHolderId { get; set; }

    public virtual PersonalDetail Detail { get; set; }
}

//Added later 
public partial class Nominee
{
    public int NomineeId { get; set; }

    public virtual PersonalDetail Detail { get; set; }
}

public partial class PersonalDetail
{
    public int PersonalDetailId { get; set; }

    ... 
}

私の流暢なAPIコード:

        modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Detail)
                                            .WithRequired()
                                            .WillCascadeOnDelete();
        //Added later
        modelBuilder.Entity<Nominee>().HasOptional(p => p.Detail)
                                      .WithRequired()
                                      .WillCascadeOnDelete();

最初は2つのテーブルしかなくAccountHolderPersonalDetails共有主キーアプローチがうまく機能していました。Nomineeしかし、と 1 対 1 の関係を持つテーブルを追加すると、問題が発生しPersonalDetailsます。例外が発生するよりも、コードの最初の移行のUpdate-Database コマンドNomineeを実行したときに新しいテーブルを追加した後:

「IX_PersonalDetailId」という名前のインデックスまたは統計がテーブル「PersonalDetails」に既に存在するため、操作は失敗しました

誰でも何が問題なのか、どうすればこの問題を解決できるのか教えてもらえますか?

編集 :

ここで、この問題に関する私の研究を共有しています。間違っている場合は修正してください。共有主キー アプローチでは、従属テーブルの PK がプリンシパル テーブルの FK でもあるため、この例外が発生する可能性があります。したがって、この場合、2 つのプリンシパル テーブル ieAccountHolderNominee1 つの従属テーブル ieがありPersonalDetailます。そのため、エンティティ フレームワークが上記の例外よりも同じ名前の 2 つの FK を作成しようとすると、結果が発生します。

4

1 に答える 1

1

私は自分のコメントを拡張したかった。

命名の問題を解決したとしても、1 つの列を 2 つのテーブルの外部キーにすることはできません。

AccountHolder テーブルに次のレコードがあるとします。

Id
----
1
2
3

Nominee テーブルには次のレコードがあります

Id
----
3
4
5

を使用して PersonalDetail にレコードを挿入するとしDetailId = 3ます。それは Nominee 3 または AccountHolder 3 と一致しますか?

また、PersonalDetail を で挿入しようとするとDetailId = 2、Nominee 2 がないDetailId = 4ため、FK 違反になります。

于 2013-03-04T14:21:21.240 に答える