检索和修改实体,而无需维护数据库上下文
本文关键字:维护 数据库 上下文 修改 实体 检索 | 更新日期: 2023-09-27 18:30:49
我是实体框架的新手。我正在使用在 WPF 应用程序中使用数据库。我已经创建了一个模型,如本博客所示,现在我想在我的应用程序中使用它。
我知道如何像这样检索和修改实体:
DatabaseContext ct = new DatabaseContext();
var person = ct.Persons.Find(1);
person.Name = "NewName";
ct.SaveChanges();
但是,在等待用户输入的应用程序中,这意味着将数据上下文保留在 ViewModel 中,这不是很可取。相反,我想做这样的事情:
class PersonViewModel {
Person psn;
public PersonViewModel(int PersonId) {
DatabaseContext ct = new DatabaseContext();
psn = ct.Persons.Find(1);
}
public Save() {
DatabaseContect ct = new DatabaseContext();
ct.Persons.Update(psn); // (There is no Update() method.)
ct.SaveChanges();
}
}
我不知道该怎么做Update()
.
我有这样定义的数据库上下文:
public partial class DatabaseContext: DbContext
{
public DbSet<Person> Persons { get; set; }
}
但我似乎没有DatabaseContext.ObjectStateManager
,有些人在解决类似问题时使用。我不知道这是为什么 - 它与使用 POCO 对象有关吗?
我应该如何解决这个问题?
作为 Attach 的替代方法:
public Save() {
DatabaseContect ct = new DatabaseContext();
ct.Entry(psn).State = EntityState.Modified;
ct.SaveChanges();
}
可以使用 Attach 方法。
public Save() {
using(DatabaseContect ct = new DatabaseContext())
{
ct.Persons.Attach(psn);
ct.SaveChanges();
}
}
你需要
使用Attach()
方法。您可以在此处找到更多详细信息:http://msdn.microsoft.com/en-us/library/bb896248.aspx
ct.Persons.Attach(psn); // instead of Update()
事情可能会变得更加复杂,因为附加的对象将处于"未更改"状态,您需要将其更新为"已修改"。