【问题标题】:Validation of entity using FluentValidation library使用 FluentValidation 库验证实体
【发布时间】:2014-11-10 09:58:03
【问题描述】:

如何在执行更新或删除之前检查实体本身是否存在?

我尝试使用类似下面的代码,但收到错误“必须指定属性名称”。如何实现这样的逻辑?

public CustomValidator()
{
     RuleFor(x=>x).Must(ExistsInDatabase).WithMessage("Attempt to work with nonexistent entity");
}

private bool ExistsInDatabase(MyClass myClassInstance)
{

     if (myClassInstance == null)
           return false;

     return true;

   }

更新:问题涉及 RuleFor() 中的语法 - 是否可以在不指定特定属性的情况下使用 (x=>x) ?或以其他方式检查正在验证的整个实体的状态?

【问题讨论】:

    标签: c# validation fluentvalidation


    【解决方案1】:

    我相信您需要在 ExistsInDatabase 类中编写更多功能,以便它能够在数据库中查找是否存在具有相同主键的实体。

    如果您使用实体框架,您可以在 ExistsInDatabase 类上使用泛型,以便它可以调用您的上下文。您可以在上下文类中添加一个简单的帮助器,类似于以下内容

    public virtual IDbSet<T> DbSet<T>() where T : class
        {
            return this.Set<T>();
        }
    

    一旦你有了一个集合,你就可以使用 EF Find 方法,它会根据主键进行搜索。比如这样的事情

    var result = context.DbSet<Business>().Find(1);
    return result == null ? false : true;
    

    【讨论】:

    • 如何将整个实体传递给 ExistsInDatabase() 方法?
    • 当你说 RuleFor(x => x).Must(ExistsIndatabase) 时 x 的值是多少?您能否展示一下您是如何使用它的,也许是在显示它正在使用的测试方法中的广告。从那里我们将能够确定您如何进行。我所做的事情是,我的所有实体都继承自一个基类,即具有某些属性的抽象类。如果你有这个,你可以简单地期望它作为 ExistsInDatabase 方法中的一个参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多