Code First Fluent API验证无效

时间:2012-04-06 18:25:25

标签: c# asp.net-mvc-3 entity-framework ef-code-first entity-framework-4.3

有一个课 - 这是一个普通的课没什么特别的:

public class Trader{

public Guid UserId {get;set;}
public int TraderId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string PhoneNumber { get; set; }
public string Skype { get; set; }
public string Photo { get; set; }
public string Email { get; set; }

public virtual User User { get; set; }
}

映射:

 public TraderMap()
        {
            this.ToTable("Trader", "General");
            this.HasKey(a => a.TraderId);
            this.HasRequired(a => a.User).WithMany().HasForeignKey(a => a.UserId);
            Property(a => a.UserId).HasColumnName("UserID").IsRequired();
            Property(a => a.TraderId).HasColumnName("TraderID").IsRequired();

            Property(a => a.FirstName).HasMaxLength(50).IsRequired();
            Property(a => a.LastName).HasMaxLength(50).IsRequired();
            Property(a => a.PhoneNumber).HasMaxLength(25).IsRequired();
            Property(a => a.Skype).HasMaxLength(50).IsOptional();
            Property(a => a.Photo).HasMaxLength(100).IsOptional();
            Property(a => a.Email).HasMaxLength(100).IsRequired();
        }

当我在表单(View)中将FirstName或其他具有IsRequired()的字段留空时,验证不会启动。它只会遇到错误:

  

一个或多个实体的验证失败。看到   'EntityValidationErrors'属性以获取更多详细信息。

不幸的是,这个错误并没有说太多。我正在深入挖掘,但我唯一能得到的就是

  

列名称识别符无效。

我认为某些地方(对于User类)会遗忘一些遗产,但我没有发现任何可疑的遗产。

问题在于,当我在Trader类中使用属​​性时,一切都按照假设运行。

   public class Trader{

    public Guid UserId {get;set;}
    public int TraderId { get; set; }
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }
    [Required]
    public string PhoneNumber { get; set; }
    public string Skype { get; set; }
    public string Photo { get; set; }
    [Required]
    public string Email { get; set; }

    public virtual User User { get; set; }
    }

使用属性验证工作正常,@ Html.ValidationMessageFor开始显示错误消息,并且不允许发送NULL值。

您是否有任何建议我的映射会出现什么问题?

更新1 实际上,上述属性是解决此问题的可能方法。

3 个答案:

答案 0 :(得分:4)

如果您使用'数据注释',验证只会启动 - 而HasRequired执行映射 - 数据注释属性同时执行映射和验证部分。
即为了您的观点验证我相信您必须在您的属性上放置注释/属性。

这通常用于“区分”仅仅是'映射'以及映射和验证。即如果你想两者都使用属性,如果你只想映射使用流畅的配置。

此处的相关答案还有https://stackoverflow.com/a/9310435/417747https://stackoverflow.com/a/9789984/417747

编辑:感谢Justin
,这个更接近你所需要的 How to make Fluent API configuration work with MVC client side validation?

答案 1 :(得分:3)

我认为您将EF模型验证与MVC验证混淆。 MVC对EF一无所知,反之亦然。它们是可以很好地协同工作的独立技术。

在fluent数据模型上定义验证时,您只定义Entity Framework的验证。这显然有效,当您尝试保存更改时,EF失败并抱怨验证失败。

同样,这与MVC验证无关,并且两者在大多数情况下不能一起工作(一个例外是,如果您使用POCO类并使用数据注释,则一些注释在两个MVC中都有效和EF,但有些人没有。在你的视图中直接使用你的数据模型并不是一个好习惯,所以这在很大程度上是一个没有实际意义的点。)

答案 2 :(得分:1)

你们都是对的,我的假设是假的。

[必填]不等于.IsRequired()

有几种可能的解决方案:

1)快速&轻松Attributes

  

模型配置覆盖和验证

     

使用CodeFirst可以覆盖的配置   用验证属性定义的模型,例如在OnModelCreating中   方法。重新配置模型会影响验证,因为验证应该   使用实际的模型配置 - 盲目使用属性   导致根据可能有效的值的验证错误   OnModelCreating()中的覆盖。这是三个特别的   在OnModelCreating中进行覆盖的情况:

     
      
  • 如果某个属性用[Required]属性修饰并重新配置为可选(.IsOptional()方法),则[必需]   属性将被删除,因此在验证时会被忽略   发生

  •   
  • 如果使用[StringLength]或[MaxLength]属性修饰属性,然后使用新长度配置   (.HasMaxLength()方法)如果可能,将使用新的最大长度

  •   
  • 如果使用[StringLength]或[MaxLength]属性修饰属性,则定义为允许最大值   length(.IsMaxLength)然后将删除该属性(如果可能)   并且不会检查属性值的长度

  •   
     

请注意,上述更改仅在属性有效时才有效   装饰有一些验证属性。所以,将属性设置为   required(.IsRequired())不会导致属性被验证   反对空值。
  见EF Feature CTP5: Validation

2)快速修复但是Mystere Man建议的这是一个肮脏的 http://thedatafarm.com/blog/data-access/capturing-code-first-fluent-api-validationresults-to-display-in-mvc3-views/

http://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.html

3)沉重的The Validation Application Block in Enterprise Library
http://bradwilson.typepad.com/blog/2009/10/enterprise-library-validation-example-for-aspnet-mvc-2.html但企业库通常被视为过度杀伤

4)验证必杀技FluentValidation看起来非常有前途,我一定会试一试。
http://www.nuget.org/packages/FluentValidation.MVC3
缺点:不是n层应用程序中的最佳方法。它主要关注视图。

5) N层
http://www.asp.net/mvc/tutorials/older-versions/models-(data)/validating-with-a-service-layer-cs
这种方法会导致客户端验证出现问题,因此必须单独解决。

相关问题