2

假设我有以下使用 Entity Framework 5 的小控制台应用程序:

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();
}

毫无疑问,第二个更语义化,但还有其他明显的区别吗?

4

1 回答 1

4

好吧,您显式设置实体状态的第二个代码块是多余的,因为更改跟踪器已经知道实体已被修改,因为上下文知道实体(当您查询上下文以检索实体时)。

在处理断开连接的实体时,设置(或绘制)实体的状态会更有用,例如在 n 层环境中,在不同的上下文中检索实体并发送到客户端进行修改,并且您希望标记使用不同的上下文将这些更改返回到服务器上。

否则,我认为第一个代码块更干净。

于 2012-11-27T10:39:41.900 回答