C# 如何在编辑但不查看实体时实现IDataErrorInfo以验证实体

C# 如何在编辑但不查看实体时实现IDataErrorInfo以验证实体,c#,entity-framework,validation,C#,Entity Framework,Validation,首先将EntityFramework6与DB一起使用,但对它来说还是比较新的。我在模型上使用IDataErrorInfo进行验证,在编辑单个实体时效果很好。例如,编辑单个地址 但是,我注意到在加载多个实体(使用LINQ)时,性能受到了严重的影响。(例如,填充datagridview时,命令myContext.Address.ToList()占用了一秒钟来填充每一行)。这是因为对于从数据库检索到的每一行,相应的实体都会多次触发验证/错误检查代码。我意识到这是在DataGridView中绑定的结果,

首先将EntityFramework6与DB一起使用,但对它来说还是比较新的。我在模型上使用IDataErrorInfo进行验证,在编辑单个实体时效果很好。例如,编辑单个地址

但是,我注意到在加载多个实体(使用LINQ)时,性能受到了严重的影响。(例如,填充datagridview时,命令
myContext.Address.ToList()
占用了一秒钟来填充每一行)。这是因为对于从数据库检索到的每一行,相应的实体都会多次触发验证/错误检查代码。我意识到这是在
DataGridView
中绑定的结果,而不是简单地从数据库中检索

我可以通过设置一个
ValidationOn
标志来解决这个问题,该标志默认设置为false,它只会在所有验证检查中返回true。这要快得多,但在没有理由的情况下绕过这些验证检查似乎仍然效率低下

有没有办法禁用该界面,以便在需要时手动“激活”该界面

我假设从模型实体派生一个类并将其用于实现IDataErrorInfo会更好,但是如何定义可以从任何上下文对象派生的泛型类呢

我曾尝试创建以下内容:

public class ValidatingEntity : DbSet, IDataErrorInfo
    private readonly DbSet _myEntity;
    public ValidatingEntity(DbSet MyEntity) 
    {
        _myEntity = MyEntity
    }
}
这似乎可行,但我如何知道实体是什么来执行正确的验证测试。e、 g.我将如何做到这一点:

public string this[string columnName]
{
    if (_myEntity is Address)
    {
        Address myAddress = (Address)_myEntity;
        If (columnName=="AddressCode")
        {
            If (myAddress.AddressCode == string.empty) return "Code can not be blank";
        }
    }
}
如果(\u myEntity is Address)给出警告,则代码
给定表达式决不是提供的(地址)类型

总之

  • 如何基于上下文中的任何实体创建派生类
  • 如何从我的任何一个实体实例化该类
  • 有更好的方法吗
更新1

我相信我已经通过创建一个公共基类并使用下面的说明从中派生实体来解决这个问题:


它还允许我构建自己的接口来替换
IDataErrorInfo
,因为这导致我的验证代码多次触发,我现在可以避免。

经过测试,我很高兴更新1中确定的方法是解决方案(即基于此: