ASP.NET MVC 4、EF5、代码优先、SQL Server 2012 Express
在模型中实现唯一值的最佳做法是什么?我有一个 places 类,它有一个“url”属性,每个地方都应该是唯一的。
public class Place
{
[ScaffoldColumn(false)]
public virtual int PlaceID { get; set; }
[DisplayName("Date Added")]
public virtual DateTime DateAdded { get; set; }
[Required(ErrorMessage = "Place Name is required")]
[StringLength(100)]
public virtual string Name { get; set; }
public virtual string URL { get; set; }
};
为什么不可以在上面放置一个 [Unique] 数据注释?
我看到过 1 或 2 次关于此的讨论,但没有谈到最佳实践。使用 Code First,您能否以某种方式告诉数据库在数据库中的字段上设置唯一约束?
什么是最简单的方法 - 什么是最佳实践?
最佳答案
尽管听起来很疯狂,但当今的最佳做法是不使用内置验证,而是使用 FluentValidation .然后代码将非常易于阅读和 super 可维护,因为验证将在单独的类上进行管理,这意味着更少的意大利面条代码。
您要实现的目标的伪示例。
[Validator(typeof(PlaceValidator))]
class Place
{
public int Id { get; set; }
public DateTime DateAdded { get; set; }
public string Name { get; set; }
public string Url { get; set; }
}
public class PlaceValidator : AbstractValidator<Place>
{
public PlaceValidator()
{
RuleFor(x => x.Name).NotEmpty().WithMessage("Place Name is required").Length(0, 100);
RuleFor(x => x.Url).Must(BeUniqueUrl).WithMessage("Url already exists");
}
private bool BeUniqueUrl(string url)
{
return new DataContext().Places.FirstOrDefault(x => x.Url == url) == null
}
}
关于c# - ASP.NET MVC 4,EF5,模型中的唯一属性 - 最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16678625/