假设我有以下使用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();
}
毫无疑问,第二个更具语义性,但还有其他明显的差异吗?
答案 0 :(得分:4)
您明确设置实体状态的第二个代码块是多余的,因为更改跟踪器已经知道实体已被修改,因为上下文知道实体(当您查询上下文以检索实体时)。 p>
在使用断开连接的实体时,设置(或绘制)实体的状态会更有用,例如在n层环境中,在不同的上下文中检索实体并将其发送到客户端进行修改,希望使用不同的上下文在服务器上标记这些更改。
否则,我认为第一个代码块更清晰。