2

この質問は次の続きです。

コレクションに新しいオブジェクトを追加するEntityFramework

DbSetこれで、 EF を使用するとコレクション全体がメモリに読み込まれないことがわかりました

しかし、次のコードのようなものがあるとしたらどうでしょうか:

public class User
{
    public int UserID { get; set; }
    public string UserName { get; set; }
    public ICollection<Role> Roles { get; set; }
}

public class Role
{
    public int RoleID { get; set; }
    public string RoleName { get; set; }
    public User User { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }
}

public class SomeClass
{
    public void AssignRoleToUser(int userID, Role role)
    {
        var ctx = new MyContext();
        var user = ctx.Users.First(x => x.UserID.Equals(userID));

        user.Roles.Add(role);

        ctx.SaveChanges();
    }
}

この場合、オブジェクトを使用してRoleDbSetコレクションに新しいオブジェクトを追加するのではなく、コレクションを使用して特定のユーザーに新しい役割を追加しています。ICollection

では、この場合はどうなるでしょうか。

挿入を実行するために、EntityFramewrk はすべてのユーザーのロールをメモリにロードする必要がありますか?

4

2 に答える 2

1

上記の提供コードでは、ctx.Users はデータを取得するためにのみ使用されるため、新しいロールを追加していません。この SE post- Linq To Entities-how to filter on child entitiesでは、多少似た問題が取り上げられています。

この短くて役立つ記事、Entity Framework 4.0 FAQ – Getting Started Guide を参照することをお勧めします。

于 2012-12-13T20:47:04.050 に答える
1

いいえ。EF は、ユーザーが持つ「役割」を知る必要はありません。変更追跡に関して何が起こるかを学ぶ必要があります。

  1. クエリが実行されると、変更トラッカーは「ユーザー」のオブジェクト エントリを受け取ります。このユーザーの状態は「変更なし」です

  2. ユーザーの Roles コレクションに新しいロールを追加します。これは、この新しいロールの変更トラッカー エントリを追加し、「追加済み」としてマークするだけです。

  3. SaveChanges() では、EF は変更トラッカーを調べて、ユーザー オブジェクトが変更されていないことを確認するので、そこで何もする必要はありません。追加する必要があることを示す新しい役割のエントリもあります。そのため、このロールを挿入するための SQL クエリが作成されます。

そのような単純な。いつでも変更トラッカーの状態を監視してデバッグおよび追加できます。エントリは、DbContext.ChangeTracker.Entries() を呼び出すことで見つけることができます。

EF はやみくもに「追加」を DB に送信します。

于 2013-01-10T04:28:40.617 に答える