2

EntityFramework5を使用する次の小さなコンソールアプリケーションがあるとします。

class Program {

    static void Main(string[] args) {

        using (var ctx = new ConfContext()) {

            var personBefore = ctx.People.First();
            Console.WriteLine(personBefore.Name);

            personBefore.Name = "Foo2";
            ctx.SaveChanges();

            var personAfter = ctx.People.First();
            Console.WriteLine(personAfter.Name);
        }

        Console.ReadLine();
    }
}

public class ConfContext : DbContext {

    public IDbSet<Person> People { get; set; }
    public IDbSet<Session> Sessions { get; set; }
}

public class Person {

    [Key]
    public int Key { get; set; }

    public string Name { get; set; }
    public string Surname { get; set; }
    public DateTime? BirthDate { get; set; }

    public ICollection<Session> Sessions { get; set; }
}

public class Session {

    [Key]
    public int Key { get; set; }
    public int PersonKey { get; set; }

    public string RoomName { get; set; }
    public string SessionName { get; set; }

    public Person Person { get; set; }
}

ご覧のとおり、レコードの名前を変更して保存しています。それは機能しますが、私には魔法のように感じます。私がすべてのアプリケーションで行っていることは、次のとおりです(より正確には、ジェネリックリポジトリのEditメソッド内で):

static void Main(string[] args) {

    using (var ctx = new ConfContext()) {

        var personBefore = ctx.People.First();
        Console.WriteLine(personBefore.Name);

        personBefore.Name = "Foo2";
        var entity = ctx.Entry<Person>(personBefore);
        entity.State = EntityState.Modified;
        ctx.SaveChanges();

        var personAfter = ctx.People.First();
        Console.WriteLine(personAfter.Name);
    }

    Console.ReadLine();
}

2番目のものがよりセマンティックであることは間違いありませんが、他に明らかな違いはありますか?

4

1 に答える 1

4

エンティティの状態を明示的に設定する2番目のコードブロックは冗長です。コンテキストがエンティティを認識しているため(エンティティを取得するためにコンテキストをクエリするとき)、変更トラッカーはエンティティが変更されたことをすでに認識しているためです。

エンティティの状態を設定(またはペイント)することは、切断されたエンティティを操作する場合、たとえば、エンティティが別のコンテキストで取得され、変更のためにクライアントに送信され、マークを付ける必要があるn層環境でより便利になります。これらの変更は、別のコンテキストを使用してサーバーに戻されます。

そうでなければ、最初のコードブロックは私の意見ではよりクリーンです。

于 2012-11-27T10:39:41.900 に答える