【问题标题】:EF 6 IsRequired() allowing empty stringsEF 6 IsRequired() 允许空字符串
【发布时间】:2013-12-16 19:50:24
【问题描述】:

在过去使用 EF5 和 EF4 版本的项目中,如果属性为 null 或空字符串,IsRequired() fluent API 方法将引发 DbEntityValidationException。在我当前使用 EF6 的项目中,当字符串属性为空时,不会引发 DBEntityValidationException。

实体:

public class Application : BaseEntity
{
    public string Name { get; set; }

    // navigation properties
    public IList<Role> Roles { get; set; }
}

配置:

internal class ApplicationMapping : EntityTypeConfiguration<Application>
{
    public ApplicationMapping()
    {
        // table name
        this.ToTable("Applications");

        // properties
        this.Property(t => t.Name)
            .IsRequired()
            .HasMaxLength(100);
    }
}

在翻阅 MSDN EF 文档和堆栈溢出之后,我不知道为什么会发生这种情况。是否向 EF6 添加/修改了约定?

【问题讨论】:

  • 你在OnModelCreated方法里面注册了你的EntityTypeConfiguration吗?所以modelBuilder.Configurations.Add(new ApplicationMapping ());
  • 是的,我已经验证了实体类型配置是在创建模型时实例化的。 IsRequired() 在 Name 属性为 null 时抛出 DBEntityValidationException,但在 Name = string.Empty 时不抛出

标签: entity-framework entity-framework-6


【解决方案1】:

这些天你仍然可以使用[Required] 属性并具有可配置的AllowEmptyStrings

[Required(AllowEmptyStrings = false)]

默认为假

【讨论】:

  • 我不知道他们为什么会让空字符串验证失败。将列标记为不可为空不应禁止空字符串。
  • 我的字段不为空。但我应该能够在其中插入空字符串。当我有 EF 数据库优先(edmx)时,它允许空字符串。现在我更改为 EF Code-first,它会自动将 [Required] 属性放在道具上,并且不允许空字符串。一直在挣扎,直到我看到您的解释,但这可能会令人困惑(在数据库级别没有类似的概念..它不在乎您的字符串是空的,有一个字符还是 1000 个字符!)
  • 其实。如果你真的需要插入一个空字符串。 AllowEmptyStrings = true 还不够,还必须设置 ConvertEmptyStringToNull = false。
【解决方案2】:

您可能会混淆StringColumnConfiguration.IsRequired MethodRequiredAttribute

.IsRequired() 标记数据库中的该列是NOT NULL。但是,[Required] 注释会在属性为 null、包含空字符串 ("") 或仅包含空白字符时引发验证异常。

【讨论】:

  • 这看起来是一个不错的建议,流畅的 api 只是不为空,因为它是必需的。也许在筛选空字符串之前您还有其他一些检查。
  • 我刚刚验证了,当尝试存储包含实体并将该属性设置为 null 或“”时,属性上的 [Required] 属性将触发验证异常。这是使用 EF6。
  • 但是这里的冲突是你在DB中设置“not null”并在VS2015中自动生成poco类,属性标记为[必需],然后你认为你可以插入String.Empty但是它崩溃了.它是 EF poco 生成中的错误吗?
【解决方案3】:

这里的 EF Core 2.1 - 看起来像使用 [Required] 将属性标记为需要并使用空字符串值将其保存到数据库中,让它通过...非常奇怪。

文档说明如下:

//
// Summary:
//     Gets or sets a value that indicates whether an empty string is allowed.
//
// Returns:
//     true if an empty string is allowed; otherwise, false. The default value is false.
public bool AllowEmptyStrings { get; set; }

【讨论】:

  • 不幸的是,[Required] 属性(来自DataAnnotations)根据使用上下文具有不同的语义。例如,在 JSON.NET 架构验证中,这意味着 JSON 属性必须存在,但它可以具有 null 或空字符串值。在 ASP.NET MVC 中,它确实尊重 AllowEmptyStrings 并且意味着该属性必须有一个值(但如果它是一个复杂的属性,则不是很烦人)并且 EF Core 也在做自己的事情。啊。
猜你喜欢
  • 1970-01-01
  • 2014-06-21
  • 2015-10-04
  • 1970-01-01
  • 2019-07-16
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
相关资源
最近更新 更多