entity framework代码第一个唯一列
我正在使用entity framework4.3和使用代码拳头。
我有一堂课
public class User { public int UserId{get;set;} public string UserName{get;set;} } 创build数据库表时,如何告诉entity frameworkUserName必须是唯一的? 如果可能的话,我宁愿使用数据注释而不是configuration文件。
在Entity Framework 6.1+中,您可以在模型上使用此属性:
 [Index(IsUnique=true)] 
你可以在这个命名空间中find它:
 using System.ComponentModel.DataAnnotations.Schema; 
如果您的模型字段是一个string,请确保它未在SQL Server中设置为nvarchar(MAX),否则您将看到与entity frameworkCode First:
表'dbo.y'中的列'x'是用作索引中的键列的无效types。
原因是因为这个:
SQL Server将保留所有索引键列的最大总大小的900字节限制。“
(来自: http : //msdn.microsoft.com/en-us/library/ms191241.aspx )
您可以通过在模型上设置最大string长度来解决此问题:
 [StringLength(450)] 
在EF CF 6.1+中,您的模型将如下所示:
 public class User { public int UserId{get;set;} [StringLength(450)] [Index(IsUnique=true)] public string UserName{get;set;} } 
更新:
如果你使用Fluent:
  public class UserMap : EntityTypeConfiguration<User> { public UserMap() { // .... Property(x => x.Name).IsRequired().HasMaxLength(450).HasColumnAnnotation("Index", new IndexAnnotation(new[] { new IndexAttribute("Index") { IsUnique = true } })); } } 
并在您的模型构build器中使用:
 protected override void OnModelCreating(DbModelBuilder modelBuilder) { // ... modelBuilder.Configurations.Add(new UserMap()); // ... } 
更新2
为EntityFrameworkCore另请参阅此主题: https : //github.com/aspnet/EntityFrameworkCore/issues/1698
  EF不支持除键之外的唯一列。 如果您正在使用EF迁移,则可以强制EF在UserName列(在迁移代码中,而不是任何注释)上创build唯一索引,但唯一性将仅在数据库中实施。 如果您尝试保存重复值,您将不得不捕获数据库触发的exception(违反约束)。 
 从你的代码中可以看出你使用POCO。 有另一个键是不必要的:你可以添加juFobuild议的索引 。 
 如果您使用Fluent API而不是赋予UserName属性,那么您的列注释应如下所示: 
 this.Property(p => p.UserName) .HasColumnAnnotation("Index", new IndexAnnotation(new[] { new IndexAttribute("Index") { IsUnique = true } } )); 
这将创build以下SQL脚本:
 CREATE UNIQUE NONCLUSTERED INDEX [Index] ON [dbo].[Users] ( [UserName] ASC ) WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY] 
如果您尝试插入具有相同用户名的多个用户,则会收到带有以下消息的DbUpdateException:
 Cannot insert duplicate key row in object 'dbo.Users' with unique index 'Index'. The duplicate key value is (...). The statement has been terminated. 
同样,在6.1版本之前的entity framework中,列注解是不可用的。
请注意,在Entity Framework 6.1(目前处于testing阶段)将支持IndexAttribute注解索引属性,这将自动导致Code First Migrations中的(唯一)索引。
EF4.3的解决scheme
唯一的用户名
在列上添加数据注释:
  [Index(IsUnique = true)] [MaxLength(255)] // for code-first implementations public string UserName{get;set;} 
独特的ID ,我已经添加了装饰[钥匙]在我的专栏和完成。 与此处所述的解决scheme相同: https : //msdn.microsoft.com/en-gb/data/jj591583.aspx
IE:
 [Key] public int UserId{get;set;} 
替代答案
使用数据注释
 [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] [Column("UserId")] 
使用映射
  mb.Entity<User>() .HasKey(i => i.UserId); mb.User<User>() .Property(i => i.UserId) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) .HasColumnName("UserId"); 
- MVC模型要求为true
- entity framework代码First Fluent Api:向列添加索引
- ASP.NET MVC:通过DataAnnotation进行自定义validation
- Validator.TryValidateObject不validationRangeAttribute
- 使用数据注释自定义模型依赖属性的validation
- 数据注释validation确认密码
- MVC中UIHint属性的用法是什么
- 如何使用DataAnnotations在ASP.NET MVC 2中处理Booleans / CheckBoxes?
- “创build时需要Id字段”validation消息; Id未设置为