Linq to sql 自定义DataContext基类型上的INotifyPropertyChanged不';t火

Linq to sql 自定义DataContext基类型上的INotifyPropertyChanged不';t火,linq-to-sql,mocking,datacontext,inotifypropertychanged,Linq To Sql,Mocking,Datacontext,Inotifypropertychanged,对于自动生成的DataContext类中类型的超类,MyContext,我有一个名为MyEntityBase的自定义基类型。在尝试创建模拟数据上下文时,我决定在MyEntityBase上实现INotifyPropertyChanged,这样我就可以一般地跟踪更改 下面是我的班级的样子: public abstract class MyEntityBase : INotifyPropertyChanged { public event PropertyChangedEventHandler

对于自动生成的
DataContext
类中类型的超类,
MyContext
,我有一个名为
MyEntityBase
的自定义基类型。在尝试创建模拟数据上下文时,我决定在
MyEntityBase
上实现
INotifyPropertyChanged
,这样我就可以一般地跟踪更改

下面是我的班级的样子:

public abstract class MyEntityBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
}
基于这个类,我创建了一个通用的
存储库
类,用于存储特定类型实体的实例。这个类背后的基本思想是提供类似于datacontext的方法,但由内存中的列表支持。我还想模拟跟踪更改,因为更改集对于与第三方系统同步的应用程序的业务逻辑很重要

下面是
存储库
的一个基本shell实现:

我做错了什么


更新:如果我将订阅事件的行更改为以下内容:

(entity as Employee).PropertyChanged += ...

那么它工作得很好。然而,
T
已经被认为是
Employee
,而
entity
Employee
类型的实例,那么有什么区别呢?即使我将
MyEntityBase
中的
事件
设置为
virtual
,它仍然不能正常工作。

我已经实现了一个可行的解决方案,因此我将回答我自己的问题。因为我已经有了一个命令行工具
FindAndReplaceText.exe
,我用它来对自动生成的
MyDataContext.dbml
文件进行一些自定义,所以我只是在最后添加了另一个调用,修改生成的
MyDataContext
类中的所有事件,以包括
override
。再加上让我的基类在事件定义中使用
virtual
,这就解决了问题:

FindAndReplaceText.exe -c ^
    MyDataContext.cs ^
    "public event" ^
    "public override event"

现在,属性更改将在我的测试代码中正确通知。

我在这里复制了您的代码(并将虚拟添加到实体)。那似乎管用。。也许是员工把事情搞砸了?我无法控制
Employee
,因为它是使用
SQLMetal
自动生成的。但是看起来区别在于缺少
override
关键字,删除它会导致测试代码再次失败。因此,看起来我需要一种方法来强制继承的类(如
Employee
)始终覆盖
PropertyChanged
,即使关键字
override
不存在。这样的事情可能吗?
(entity as Employee).PropertyChanged += ...
FindAndReplaceText.exe -c ^
    MyDataContext.cs ^
    "public event" ^
    "public override event"