80

Entity Framework Code First を使用して、1 対 1 のオプションの関係を使用したいと考えています。2 つのエンティティがあります。

public class PIIUser
{
    public int Id { get; set; }

    public int? LoyaltyUserDetailId { get; set; }
    public LoyaltyUserDetail LoyaltyUserDetail { get; set; }
}

public class LoyaltyUserDetail
{
    public int Id { get; set; }
    public double? AvailablePoints { get; set; }

    public int PIIUserId { get; set; }
    public PIIUser PIIUser { get; set; }
}

PIIUserを持っているかもしれませんが、持っている必要がありLoyaltyUserDetailます。これらの流暢なアプローチ手法を試しました。LoyaltyUserDetailPIIUser

modelBuilder.Entity<PIIUser>()
            .HasOptional(t => t.LoyaltyUserDetail)
            .WithOptionalPrincipal(t => t.PIIUser)
            .WillCascadeOnDelete(true);

このアプローチでは、テーブルLoyaltyUserDetailIdに外部キーが作成されませんでした。PIIUsers

その後、次のコードを試しました。

modelBuilder.Entity<LoyaltyUserDetail>()
            .HasRequired(t => t.PIIUser)
            .WithRequiredDependent(t => t.LoyaltyUserDetail);

しかし今回は、EF はこれら 2 つのテーブルに外部キーを作成しませんでした。

この問題について何かアイデアはありますか?エンティティ フレームワークの流暢な API を使用して、1 対 1 の任意の関係を作成するにはどうすればよいですか?

4

7 に答える 7

3

コードにはいくつか問題があります。

1 :1の関係は、一方の PK 側も FK である PK<-PK 、またはFK側が非 PK で UC を持つPK<-FK+UCのいずれかです。あなたのコードは、あなたがFK<-FKを持っていることを示しています.FKを持つように両側を定義していますが、それは間違っています。I reconPIIUserは PK 側でLoyaltyUserDetailあり、FK 側です。これはPIIUser、FK フィールドがないことを意味しますが、LoyaltyUserDetailあります。

1:1の関係がオプションの場合、FK 側には少なくとも 1 つの null 許容フィールドが必要です。

上記の pswg はあなたの質問に答えましたが、PIIUser で FK も定義しているという間違いを犯しました。これは、上で説明したようにもちろん間違っています。したがって、 で null 許容 FK フィールドをLoyaltyUserDetail定義し、 で属性を定義しLoyaltyUserDetailて FK フィールドとしてマークしますが、 で FK フィールドを指定しないでPIIUserください。

上記の pswg の投稿の下で説明した例外が発生します。これは、どの側も PK 側ではないためです (原則の終わり)。

EF は一意の制約を処理できないため、1 対 1 ではあまり得意ではありません。私はコードの専門家ではないので、UC を作成できるかどうかはわかりません。

(編集) ところで: A 1:1 B (FK) は、2 ではなく、A の PK を指す B のターゲットに作成された FK 制約が 1 つだけあることを意味します。

于 2013-08-15T09:27:30.973 に答える
3
public class User
{
    public int Id { get; set; }
    public int? LoyaltyUserId { get; set; }
    public virtual LoyaltyUser LoyaltyUser { get; set; }
}

public class LoyaltyUser
{
    public int Id { get; set; }
    public virtual User MainUser { get; set; }
}

        modelBuilder.Entity<User>()
            .HasOptional(x => x.LoyaltyUser)
            .WithOptionalDependent(c => c.MainUser)
            .WillCascadeOnDelete(false);

これにより、 REFERENCEおよびFOREIGN KEYSの問題が解決されます。

レコードを更新または削除するとき

于 2017-07-19T06:44:00.140 に答える