c# - EF 验证上下文 : How to know if entity is being created or updated

标签 c# entity-framework validation asp.net-mvc-4

在 MVC 中对实体进行自定义验证我实现了 IValidatableObject 接口(interface)。

现在,在验证代码中,如果正在创建实体,我想做一些事情,如果正在更新,我想做一些不同的事情。以下面的代码为例,我想要什么:

public partial class ActividadProyecto : IValidatableObject
    {

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (IsBeingCreated)
            {
                // Do stuff
            }
            else if(IsBeingUpdated)
            {
                // Do other stuff
            }
        }
}

这有可能吗?我已经搜索了很多,但还没有接近这个。我找到的唯一解决方案是为创建过程制作一个 ViewModel,为更新过程制作另一个 View 模型,然后为它们制作独立的验证器:这是非常错误和丑陋的。

提前致谢!

最佳答案

通过重写 DbContext 中的 ValidateEntity() 方法,您可以通过以下方式将所需信息传递给实体的 Validate() 方法validationContext.Items 字典对象。

数据库上下文:

public class YourDbContext : DbContext
{
    // other code

    protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
    {
        items["is_data_layer"] = true;
        items["is_insert"] = this.Entry(entityEntry.Entity).State == EntityState.Added;
        return base.ValidateEntity(entityEntry, items);
    }
}

来自您的实体的用法:

public partial class ActividadProyecto : IValidatableObject
{
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        object dummy;

        // skip logic if "Validate" is not called from EF...
        if (validationContext.Items.TryGetValue("is_data_layer", out dummy))
        {
            if ((bool)validationContext.Items["is_insert"]) // insert mode
            {
                // Do stuff
            }
            else // update mode
            {
                // Do other stuff
            }
        }
    }
}

编辑:

我承认我是从纯 EF(数据层)的角度回答的。我不是 ASP.NET MVC 专家。但正如 mo.esmp 指出的那样,如果您还使用 EF 实体作为“ View 模型”,那么 MVC 框架将调用Validate() 方法来验证 View 层中的实体。并且只有之后 EF 才会调用Validate 方法。这样就可以解释为什么您的实体的 Validate 方法在上下文的 ValidateEntity 方法之前被调用。

因此,问题就变成了:对于添加的逻辑,您对哪种验证感兴趣?你想在“ View 层”验证中添加逻辑吗?或者您想在“数据层”(EF) 验证期间应用您的逻辑?

我没有足够的细节来为您回答这个问题。但是,如果您只需要在“数据层”(EF) 验证阶段添加逻辑,那么我已经调整了上面的示例代码以在 EF 未调用验证时跳过逻辑。您可以尝试一下。

关于c# - EF 验证上下文 : How to know if entity is being created or updated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32150122/

相关文章:

java - 使用 Spring 按条件验证对象字段

c# - 如何从代码中模拟 Web 浏览器的 http 请求?

c# - 有什么方法可以在后台运行进程?

c# - 在多层应用程序的 DbContext 上使用 Ninject

javascript - jquery 验证插件中的转义点

r - 使用 R 在 randomForest 上执行交叉验证

c# - 我怎样才能最好地利用 Json.NET 修改现有 JSON 对象的部分内容?

c# - Microsoft.Excel.Office.Core 和 Microsoft.Office.Interop.Excel 之间有什么区别?

entity-framework - EF Core Add 函数返回负 id

c# - 如何首先使用 EF 代码在运行时从 ObjectContext 获取实体类型列表?