0

私はEF 5でMVC 4 Code Firstを使用しており、一部のデータを正規化しようとしています。3 つのエンティティから始めて、2 つの異なるシナリオの例を示します...

ユーザーモデル

public class User
{
    public int UserId { get; set; }
    public string PseudoName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public Gender Gender { get; set; }
    public DateTime DateOfBirth { get; set; }

   // Other account related properties....

    public virtual Address Address { get; set; }
    public virtual Profile UserProfile { get; set; }
}

アドレス モデル

public class Address
{
    public int UserLocationId { get; set; }
    public int UserId { get; set; }
    // Address properties
}

プロファイル モデル

public class Profile
{
    public int UserProfileId { get; set; }
    public int UserId { get; set; }
    // Specific details about the user...
}

私は EF がトランザクションを処理する方法にあまり詳しくありません。通常、このような DB を作成し、トランザクションを起動して、ユーザーが作成されたときに、ユーザーの作成時にユーザー、プロファイル、およびアドレス レコードを作成できるようにします。EF でこの方法を実行するには、ユーザーを追加して保存し、新しく生成されたユーザーから userId を取得してから、さらに 2 つの挿入を呼び出し、アドレス/プロファイル モデルにキーを追加して保存する必要があります。途中で何かが失敗すると、ユーザーファイルが完成しないので、このようにするのはうんざりです。これが私が最初に行った方法ですが、これがDB側で受け入れられるかどうかはわかりませんが、これまでのところ問題なく機能しているようです。セカンドオピニオンが必要です。

2 番目のシナリオでは、基本的に Address モデルと Profile モデルから外部キーを削除します。コンテキストを使用して User オブジェクトを作成し、User オブジェクト内に新しい Profile/Address プロパティを作成し、オブジェクトを DB に挿入して保存します。DB 側では、FK なしで新しいプロファイル/アドレスが作成されますが、ユーザー テーブルに Profile_ProfileId、Address_AddressId として FK が追加されます。

2 番目のオプションは、最初のオプションよりも意味がありますか?

4

1 に答える 1

0

EF は、1 つのトランザクションで複数の関連エンティティの挿入を処理できるほどスマートです。

var user = new User { };
user.Profile = new Profile { };
user.Address = new Address { };
context.Users.Add(user);
context.SaveChanges();

エンティティの挿入順序を把握し、データベースで生成された PK 値でプロパティを更新します。

于 2012-06-26T04:05:16.697 に答える