假设我在一个类中有以下属性(我正在使用Code First):
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
我宁愿不用这些注释装饰我的Password属性。如果可能的话,我宁愿使用Fluent Api。使用Fluent Api可以完成多少这些注释?我知道必需可以和StringLength。但我不知道ErrorMessage,DataType和Display。
答案 0 :(得分:4)
我采取观点:
a)用真正有用的业务约束来装饰POCO 。 MVC和EF等将为您检查一些重要的约束。
b)您可以而且应该为POCO添加自定义注释或其他业务规则的检查。 如果感兴趣,请参阅样本bloew:
c)数据库特定注释属于EF流利API。如果它们是特定于数据库的,在我的视图中不属于POCO。例如表名,模式,外键,关联映射,列重命名和忽略等。
d)错误消息和显示文本属于模型视图。或者至少从下面的POCO示例中抽象出来。我知道人们不喜欢双重努力,并将使用POCO作为模型视图,并喜欢简单的文本和错误消息处理。但我更喜欢完整的错误消息/文本处理解决方案,它是多语言和可配置的。在我看来,在POCO上粘贴文本并不是最好的解决方案。
显然风格和构造尺寸会影响选择,很多人会不同意d)而且我没有一个大问题。我采取了一个大图片设计模式视图,并寻找分离和抽象的地方。
这里有一个小POCO额外的样本,没有带注释但可能是。我也看到了一些带注释的好例子。这种错误风格可以在MVC中使用,并且比我视图中的注释中的文本更好。
public class POCODemo : IValidatableObject //various ways to trigger this. Some for free
/// poco members .... bla bla
//Support Business rules...
public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var vResult = base.Validate(validationContext).ToList();
if (Poco.property1 || poco.property is nasty or xyz issue)//psuedo code for your check
var memberList = new List<string> { "PropertyName1" };
var err = new ValidationResult("Some Text comes from your TEXTPOOL of choice that explains the error", memberList);
vResult.Add(err);
// }
}
return vResult;
}
答案 1 :(得分:3)
我知道必需可以和StringLength。
就是这样。
请记住,不同的“框架”可以使用相同的属性,并且用于非常不同的目的。如果您使用 - 例如 - ASP.NET MVC上下文中的Required
属性,它将用于MVC模型验证 - 在客户端通过注入页面或服务器端的一些Javascript来设置{{1 }}
实体框架代码优先使用ModelState.IsValid
属性来验证实体,但这实际上与MVC模型验证无关。如果通过配置使用Fluent API替换Required
属性,您仍会影响实体框架,但是对于ASP.NET MVC,您只需删除该属性,即不再需要该属性进行MVC验证。 ASP.NET MVC不关心Entity Framework的Fluent API。
Required
也是如此。 StringLength
,ErrorMessage
和DataType
在实体框架中不起任何作用,既不作为属性也不作为Fluent API中的对应物。