【问题标题】:Entity Framework GetValidationErrors empty for unique index实体框架 GetValidationErrors 为唯一索引为空
【发布时间】:2017-07-23 03:35:14
【问题描述】:

我想在保存上下文之前检查验证错误。 我调用 context.GetValidationErrors(),它是空的,然后我调用 context.SaveChanges(),我得到了我唯一索引的重复行的错误。

using(var context = new DefaultDbContext())
{
    var user = new User()
    {
        OSIdentity = "test"
    };
    var duplicateUser = new User()
    {
        OSIdentity = "test"
    };
    context.Users.Add(user);
    context.Users.Add(duplicateUser);    
    // this is empty
    var errors = context.GetValidationErrors(); 
    if(errors.Count == 0)
    {
        // this throws the exception for duplicate row for unique index "Idx_UserOSIdentity"
        context.SaveChanges();
    }
}

我的用户实体有以下列:

[Index("idx_UserOSIdentity", IsUnique = true)]
[Display(Name = "OSIdentity")]
[Required(AllowEmptyStrings = false, ErrorMessage = "...")]
[StringLength(450, ErrorMessage = "...")]
public string OSIdentity { get; set; }

为什么调用 context.GetValidationErrors() 时不检查唯一索引,但之后在 context.SaveChanges() 上抛出?

【问题讨论】:

    标签: c# .net entity-framework validation entity-framework-6


    【解决方案1】:

    这是 EF 架构的预期行为。

    EF 有四种类型的数据验证;

    Data Annotations:主要用于lengthemail format等UI错误检查,IndexAttribute不是验证属性,它也没有ErrorMessage属性,也没有IsValid() 方法用于根据一系列有效值对其进行验证。这就是getValidationErrors 不检查唯一性的原因。

    IValidatableObject: 钩住更多的自定义检查,通过添加一个“验证”方法来进行比数据注释无法实现的更复杂的检查

    ValidateEntity:允许访问数据库的DbContext 方法 进行验证。在我看来在这里您可以编写自己的逻辑来在保存之前检查唯一性。

    DbUpdateException: 捕获database-generated errors,EF 工作在我们的数据库之上,数据库有自己的数据完整性,在EF 的SaveChanges()SaveChangesAsync() 之后,以防数据库完整性失败就像你的唯一性失败的情况然后提交被回滚,错误通过异常传回。

    这纯粹是根据您的选择,您想在哪里捕获/处理数据库的数据完整性异常。

    【讨论】:

    • 但是 [Index] 标志在 System.ComponentModel.DataAnnotations 命名空间中,为什么不与其他数据注释一起检查呢?
    • IndexAttribute 不是验证属性,它也没有 ErrorMessage 属性,也没有 IsValid() 方法用于根据一系列有效值对其进行验证.
    • 谢谢,我明白了。所以我猜对于 Index 属性,最好在将实体添加到上下文之前检查重复项。
    • 是的,请将它标记为已回答,它对其他访客也有帮助。
    猜你喜欢
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 2017-03-20
    • 2019-12-06
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多