2

我是实体框架的新手。我正在使用 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()

我有这样定义的 DatabaseContext:

public partial class DatabaseContext: DbContext
{
    public DbSet<Person> Persons { get; set; }
}

但我似乎没有DatabaseContext.ObjectStateManager,有些人在解决类似问题时使用它。我不知道这是为什么 - 它与使用 POCO 对象有关吗?

我应该如何解决这个问题?

4

3 回答 3

2

作为附加的替代方案:

public Save() {
    DatabaseContect ct = new DatabaseContext();
    ct.Entry(psn).State = EntityState.Modified;
    ct.SaveChanges();
}
于 2012-04-10T14:20:20.627 回答
1

你需要使用Attach()方法。您可以在此处找到更多详细信息:http: //msdn.microsoft.com/en-us/library/bb896248.aspx

 ct.Persons.Attach(psn); // instead of Update()

事情可能会变得更加复杂,因为附加对象将处于未更改状态,您需要将其更新为已修改。

于 2012-04-10T14:18:30.907 回答
1

您可以使用Attach 方法

public Save() {
    using(DatabaseContect ct = new DatabaseContext())
    {
      ct.Persons.Attach(psn);
      ct.SaveChanges();
    }
}
于 2012-04-10T14:18:41.187 回答