有一个课 - 这是一个普通的课没什么特别的:
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 实际上,上述属性是解决此问题的可能方法。
答案 0 :(得分:4)
如果您使用'数据注释',验证只会启动 - 而HasRequired执行映射 - 数据注释属性同时执行映射和验证部分。
即为了您的观点验证我相信您必须在您的属性上放置注释/属性。
这通常用于“区分”仅仅是'映射'以及映射和验证。即如果你想两者都使用属性,如果你只想映射使用流畅的配置。
此处的相关答案还有https://stackoverflow.com/a/9310435/417747或https://stackoverflow.com/a/9789984/417747
编辑:感谢Justin答案 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
这种方法会导致客户端验证出现问题,因此必须单独解决。