我正在构建一个使用 Entity Framework (版本 6)来管理持久性的应用程序。这对我来说是全新的,但到目前为止我对它印象深刻。
我有一个问题,由于被不相关的答案淹没,我似乎无法在网上找到答案。基本上,我有一些表单可以向用户显示实体的详细信息以供编辑。我想要做的是有一个保存更改按钮,它根据实体的状态(或更准确地说是 DbEntityEntry)启用和禁用。
我可以从上下文中确定实体的状态,因此确定状态不是问题。它知道我遇到麻烦的状态何时发生变化。因此,一个实体可以从数据存储中加载并呈现,并且最初将处于未更改的状态。一旦用户开始编辑表单数据,实体就会被修改(由于数据绑定(bind))。
我应该在哪里连接以收到实体更改的通知?我应该 Hook 每个控件的更改事件或绑定(bind)源更改事件或其他事件吗?
详细信息: Entity Framework 6、WinForms、MySql 数据存储
最佳答案
如果你像那样实现你的实体类:
public class Person
{
public virtual int Id { get; set; }
public virtual string SomeProperty { get; set; }
}
所以类需要是公共(public)的,所有属性需要是虚拟的、公共(public)的(至少 protected )以及它们的 setter 和 getter ,然后当 DbContext 将为您实例化该实体类时,它将实例化为派生自的类的实例你的实体类。此类实现接口(interface) IEntityWithChangeTracker。因此,当您拥有 Person 实体类并且想要跟踪其中的更改时,您所要做的就是准备实现 IEntityChangeTracker 接口(interface)的类,如下所示:
public class PersonTracker : IEntityChangeTracker
{
public void EntityComplexMemberChanged(string entityMemberName, object complexObject, string complexObjectMemberName)
{
throw new NotImplementedException();
}
public void EntityComplexMemberChanging(string entityMemberName, object complexObject, string complexObjectMemberName)
{
throw new NotImplementedException();
}
public void EntityMemberChanged(string entityMemberName)
{
throw new NotImplementedException();
}
public void EntityMemberChanging(string entityMemberName)
{
throw new NotImplementedException();
}
public System.Data.Entity.EntityState EntityState
{
get { throw new NotImplementedException(); }
}
}
当然,您需要为这些方法提供实现。那么你可以使用下面的代码来测试它:
using (MyDbContext context = new MyDbContext("Test"))
{
Person p = context.People.First();
(p as IEntityWithChangeTracker).SetChangeTracker(new PersonTracker());
//After that line EntityTracker will be called
p.SomeProperty = "new value";
}
如果您想跟踪不是从数据库中获取的新创建的实体,请不要使用 new 实例化它们,而是使用 Create 方法:
Person p = context.People.Create();
关于mysql - 当实体状态改变时得到通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23901842/