在使用Entity Framework进行更新操作期间设置EntityState.Modified

时间:2012-11-27 10:30:39

标签: entity-framework entity-framework-5 dbcontext

假设我有以下使用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();
}

毫无疑问,第二个更具语义性,但还有其他明显的差异吗?

1 个答案:

答案 0 :(得分:4)

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

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

否则,我认为第一个代码块更清晰。