将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
,因为这导致我的验证代码多次触发,我现在可以避免。
答案 0 :(得分:0)
经过测试,我很高兴我在更新1中确定的方法是解决方案(即基于此:https://fairwaytech.com/2013/09/using-a-common-base-class-across-entity-framework-database-first-entities/