这个问题可能已经被问过了,抱歉
我正在研究验证我们模型的架构。我们的简单验证可以通过使用属性验证属性(一些自定义)并使用
模型状态.IsValid
但是问题是当验证需要访问数据库或访问另一个属性时。一个完美的例子是检查重复名称。在这种情况下,我们需要检查数据库中 id 不等于当前对象的重复名称(用于更新)
如果我们将其写为要应用于 name 属性的验证属性,这将导致问题。我们如何访问数据库以及如何访问 id 属性。
所以总而言之。有没有什么好的方法来解决这个问题?
这个问题可能已经被问过了,抱歉
我正在研究验证我们模型的架构。我们的简单验证可以通过使用属性验证属性(一些自定义)并使用
模型状态.IsValid
但是问题是当验证需要访问数据库或访问另一个属性时。一个完美的例子是检查重复名称。在这种情况下,我们需要检查数据库中 id 不等于当前对象的重复名称(用于更新)
如果我们将其写为要应用于 name 属性的验证属性,这将导致问题。我们如何访问数据库以及如何访问 id 属性。
所以总而言之。有没有什么好的方法来解决这个问题?
我今天花了一些时间来探索我正在从事的一个项目,并得出了这些结论。
解决方法也不错,其中大部分涉及一些反射和使用验证上下文来检查和访问模型的其他属性或使用 IValidationObject。真正的问题变成了是否可以进行需要数据库交互的验证。
对于一个我担心性能的人来说,在一个特定情况下,验证进行了一个查询,该查询返回一个对象以确保它存在,我后来需要它来进行关系分配,这将导致另一个查询。
其次,您需要考虑数据库并发性。进行重复检查的最佳方法是在插入期间而不是之前,因为数据库可能会在两个操作之间发生变化。这也与第一个原因有关,一个对象可以在数据库报告它存在后立即被删除。
在我的特定项目中,我觉得通过修改我的 EF 上下文并将任何出错的东西添加到 ModelState 来保持这种行为会更好。