您可以使用Fluent Api指定唯一键:
public class MyContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasIndex(u => u.Nickname)
.IsUnique();
}
}
public class User
{
public int UserId { get; set; }
public string Nickname { get; set; }
}
但你可以用数据注释吗?
EF7 Beta 8中的方法更改:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.Index(u => u.Nickname)
.Unique();
}
答案 0 :(得分:8)
我担心在EF 7中仍然不支持使用数据注释创建Index
。请检查link。
我还尝试在上一版本中找到与该主题相关的一些信息,但我找不到任何内容。
我现在找到一位来自EF开发者(divega)的post 说:
在EF7中,我们支持使用流畅的API定义索引,但不支持 属性,至少还没有。您可能是IndexAttribute 指的是我们在某些时候添加到EF 6.x包中的内容 但从未真正成为标准的DataAnnotation。
我们不想原样从EF6复制原始属性,因为 我们想要改变一些事情。也, 直接在DataAnnotations中使用它可能会更有意义 而不是将其添加到EF7包。 我应该提一下,我们不太可能添加 EF7 RTM时间范围内的IndexAttribute。
显然,这是一项不会添加到EF Core的功能,至少目前是这样。
无法使用数据注释配置索引。
但你可以使用Fluent Api来做到这一点:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.HasIndex(b => b.Url)
.HasName("Index_Url");
}
答案 1 :(得分:1)
如果没有内置支持,您可以使用自己的自定义属性来注释模型属性并应用于OnModelCreating()
:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
foreach (var entity in modelBuilder.Model.GetEntityTypes())
{
foreach (var prop in entity.GetProperties())
{
var index = prop.PropertyInfo.GetCustomAttribute<IndexAttribute>();
if (index != null)
{
entity.AddIndex(prop);
}
}
}
}
使用简单的标记属性类:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class IndexAttribute : Attribute
{
}
然后在模型类中,只需添加属性即可创建二级索引:
public class User
{
public int UserId { get; set; }
[Index]
public string Nickname { get; set; }
}