2013-12-16 48 views
5

在以前的版本为EF5和EF4的项目中,如果属性为null或空字符串,则IsRequired()流利API方法将抛出DbEntityValidationException。在我当前的utilizng EF6项目中,当字符串属性为空时,不会引发DBEntityValidationException。EF 6 IsRequired()允许空字符串

实体:

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?

+0

有您注册'EntityTypeConfiguration'内的'OnModelCreated'方法里面?因此,使用'modelBuilder.Configurations.Add(new ApplicationMapping());' – nemesv

+0

是的,我已经验证实体类型配置是在模型创建时实例化的。当Name属性为null时,IsRequired()会引发DBEntityValidationException,但当Name = string.Empty时,则不会引发DBEntityValidationException。 – awolske

回答

11

您可能会混淆StringColumnConfiguration.IsRequired MethodRequiredAttribute

.IsRequired()标记数据库中的列为NOT NULL。但是,如果该属性为空,包含空字符串(“”)或仅包含空格字符,则会引发验证异常。

+0

这看起来不错,建议流畅的api只是不为空。也许还有一些检查是在筛选空弦之前进行的。 –

+0

我刚刚证实,当包含实体被试图与被设置为null或“”的属性一起存储时,属性上的[Required]属性将触发验证异常。这是EF6。 – Oliver

+0

但这里的冲突是你在数据库中设置了“not null”,并且在VS2015中自动生成了poco类,Property被标记为[Required],那么你认为你可以插入String.Empty,但它会崩溃。这是EF poco一代中的一个错误吗? – batmaci

9

这些日子里,你仍然可以使用[Required]属性,并具有可配置AllowEmptyStrings

[Required(AllowEmptyStrings = false)] 

False是默认值