mysql - 当实体状态改变时得到通知

标签 mysql winforms entity-framework

我正在构建一个使用 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/

相关文章:

mysql - 我可以在存储过程中运行 group by 语句并将输出作为变量返回吗

mysql - System.Data.SqlClient.SqlException 字符串后未闭合的引号

c# - 在运行时动态地向 TableLayoutPanel 添加控件

mysql - 复杂的 SQL 联合

mysql - 如何根据学号在联结表上进行选择

c# - 如何向 ContextMenuStrip 和 ToolStrip 添加相同的 ToolStripButtons?

c# - 使用 C# 更新 MySQL 中的值数据库

c# - 无法在 asp.net View 中显示来自数据库的图像

entity-framework - 在 MVC "No parameterless constructor defined for this object."中搭建读取操作的脚手架

.net - 如何在 Visual Basic 中使用 LINQ to Entities?