nii*_*ico 16 c# asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5
ASP.NET MVC 4,EF5,Code First,SQL Server 2012 Express
在模型中强制使用唯一值的最佳做法是什么?我有一个具有'url'属性的place类,对于每个地方都应该是唯一的.
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; }
};
Run Code Online (Sandbox Code Playgroud)
为什么不能只放置一个[Unique]数据注释?
我已经看过1或2次讨论,但没有谈到最佳实践.使用Code First可以以某种方式告诉数据库在数据库中的字段上设置唯一约束吗?
什么是最简单的方法 - 什么是最佳实践?
Sta*_*tan 28
尽管听起来很疯狂,但现在最好的做法是不使用内置验证,而是使用FluentValidation.然后代码将非常易于阅读和超级可维护,因为验证将在单独的类上进行管理,这意味着更少的意大利面条代码.
你试图实现的伪示例.
[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
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
此链接可能有所帮助:https: //github.com/fatihBulbul/UniqueAttribute
[Table("TestModels")]
public class TestModel
{
[Key]
public int Id { get; set; }
[Display(Name = "Some", Description = "desc")]
[Unique(ErrorMessage = "This already exist !!")]
public string SomeThing { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
唯一的方法是在生成迁移后更新迁移(假设您正在使用它们),以便它对列强制执行唯一约束.
public override void Up() {
// create table
CreateTable("dbo.MyTable", ...;
Sql("ALTER TABLE MyTable ADD CONSTRAINT U_MyUniqueColumn UNIQUE(MyUniqueColumn)");
}
public override void Down() {
Sql("ALTER TABLE MyTable DROP CONSTRAINT U_MyUniqueColumn");
}
Run Code Online (Sandbox Code Playgroud)
但是,硬件位是在到达数据库之前在代码级强制执行约束.为此,您可能需要一个包含唯一值的完整列表的存储库,并确保新实体不会通过工厂方法违反该实体.
// Repository for illustration only
public class Repo {
SortedList<string, Entity1> uniqueKey1 = ...; // assuming a unique string column
public Entity1 NewEntity1(string keyValue) {
if (uniqueKey1.ContainsKey(keyValue) throw new ArgumentException ... ;
return new Entity1 { MyUniqueKeyValue = keyValue };
}
}
Run Code Online (Sandbox Code Playgroud)
参考文献:
脚注:
首先在代码中有很多对[Unique]的请求,但它看起来甚至没有版本6:http://entityframework.codeplex.com/wikipage?title = Routemap
你可以尝试在这里投票:http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1050579-unique-constraint-ie-candidate-key-support
| 归档时间: |
|
| 查看次数: |
38020 次 |
| 最近记录: |