ASP.NET MVC 4,EF5,模型中的独特属性 - 最佳实践?

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)

  • 最佳实践根据谁?也可能有人认为,这是一大堆代码,可以获得最小的收益 (2认同)

小智 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)


And*_*own 5

唯一的方法是在生成迁移后更新迁移(假设您正在使用它们),以便它对列强制执行唯一约束.

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