如何在编辑但未查看

时间:2017-07-18 12:10:21

标签: c# entity-framework validation

将Entity Framework 6与DB First一起使用但仍然相对较新。我在模型上使用IDataErrorInfo进行验证,在编辑单个实体时可以正常工作。例如。编辑单个地址。

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

我可以通过设置ValidationOn标志来解决这个问题,默认设置为false,只返回所有验证检查的true。这样更快,但在没有理由的情况下运行那些验证检查似乎效率低下。

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

我认为最好从我的模型实体派生一个类并使用它来实现IDataErrorInfo但是如何定义一个可以从我的任何上下文对象派生的泛型类?

我试过创建这个:

public class ValidatingEntity : DbSet, IDataErrorInfo
    private readonly DbSet _myEntity;
    public ValidatingEntity(DbSet MyEntity) 
    {
        _myEntity = MyEntity
    }
}

这似乎有效,但我怎么知道实体执行正确的验证测试是什么。例如我该怎么做:

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";
        }
    }
}

代码if (_myEntity is Address)会发出警告given expression is never of the provided (Address) type

总之,

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

更新1

我相信我已经通过创建Common Base类并使用此处的说明从那里派生我的实体来解决这个问题:Using A Common Base Class Across Entity Framework Database First Entities

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

1 个答案:

答案 0 :(得分:0)

经过测试,我很高兴我在更新1中确定的方法是解决方案(即基于此:https://fairwaytech.com/2013/09/using-a-common-base-class-across-entity-framework-database-first-entities/