我无法为我的字段属性添加唯一约束
public class User
{
[Required]
public int Id { get; set; }
[Required]
// [Index("IX_FirstAndSecond", 2, IsUnique = true)] not supported by core
public string Email { get; set; }
[Required]
public string Password { get; set; }
}
我正在使用
"Microsoft.EntityFrameworkCore": "1.0.1",
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.1",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.1",
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
答案 0 :(得分:180)
在EF核心上,您无法使用数据注释创建索引。但您可以使用Fluent API执行此操作。
在{Db}Context.cs
:
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<User>()
.HasIndex(u => u.Email)
.IsUnique();
}
...或者如果你在buildAction中使用了重载:
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<User>(entity => {
entity.HasIndex(e => e.Email).IsUnique();
});
}
您可以在此处详细了解:Indexes
答案 1 :(得分:41)
此外,如果您想在多个列上创建唯一约束,您可以执行此操作(关注@ Sampath&#39; s link)
class MyContext : DbContext
{
public DbSet<Person> People { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.HasIndex(p => new { p.FirstName, p.LastName })
.IsUnique(true);
}
}
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
答案 2 :(得分:5)
EF Core解决方案
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Passport { get; set; }
}
public class ApplicationContext : DbContext
{
public DbSet<User> Users { get; set; }
public ApplicationContext()
{
Database.EnsureCreated();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=efbasicsappdb;Trusted_Connection=True;");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().HasAlternateKey(u => u.Passport);
//or: modelBuilder.Entity<User>().HasAlternateKey(u => new { u.Passport, u.Name})
}
}
DB表格如下所示:
CREATE TABLE [dbo].[Users] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (MAX) NULL,
[Passport] NVARCHAR (450) NOT NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [AK_Users_Passport] UNIQUE NONCLUSTERED ([Passport] ASC)
);
答案 3 :(得分:2)
Ef核心支持独特的配置。
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Account>()
.HasIndex(account => account.Email)
.IsUnique();
}
Ef核心支持多个唯一键
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Account>()
.HasKey(account => new { account.Id, account.Email, account.RoleId });
}
不要忘记运行ef core命令来进行迁移和更新数据库
>> dotnet ef migrations add MigrationName -c YourDbContextName
>> dotnet ef database update -c YourDbContextName
答案 4 :(得分:2)
从 Entity Framework Core (EF Core) 5.0 开始,我们可以configure Unique Indexes via Data Annotations。
它与例如几乎没有什么不同EF6,因为我们不能在属性本身上设置它,而是在类上设置。
[Index(nameof(EmailAddress), IsUnique = true)]
public class User
{
[Key]
public Guid Id { get; set; }
[Required]
public string FullName { get; set; }
[Required]
public string EmailAddress { get; set; }
}
有关索引和数据注释的更多信息,请参阅:https://docs.microsoft.com/en-us/ef/core/modeling/indexes?tabs=data-annotations
答案 5 :(得分:1)
在.NET Core 2.2中,这些方法都不适合我,但是我能够修改一些代码,以定义一个不同的主键来实现此目的。
在下面的实例中,我要确保OutletRef字段是唯一的:
public class ApplicationDbContext : IdentityDbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Outlet>()
.HasIndex(o => new { o.OutletRef });
}
}
这将在数据库中添加所需的唯一索引。 但是,它并没有提供指定自定义错误消息的功能。
答案 6 :(得分:1)
要通过模型配置在EF核心中使用
public class ApplicationCompanyConfiguration : IEntityTypeConfiguration<Company>
{
public void Configure(EntityTypeBuilder<Company> builder)
{
builder.ToTable("Company");
builder.HasIndex(p => p.Name).IsUnique();
}
}
答案 7 :(得分:0)
对于尝试所有这些解决方案但没有工作的人尝试这个,它对我有用
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<User>().Property(t => t.Email).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_EmailIndex") { IsUnique = true }));
}
答案 8 :(得分:0)
OP正在询问是否可以为唯一键的Entity类添加属性。简短的答案是,这是可能的,但EF核心团队没有现成的功能。 如果您想使用属性将唯一键添加到Entity Framework Core实体类,则可以执行我发布的here
public class Company
{
[Required]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid CompanyId { get; set; }
[Required]
[UniqueKey(groupId: "1", order: 0)]
[StringLength(100, MinimumLength = 1)]
public string CompanyName { get; set; }
[Required]
[UniqueKey(groupId: "1", order: 1)]
[StringLength(100, MinimumLength = 1)]
public string CompanyLocation { get; set; }
}
答案 9 :(得分:0)
我们可以使用流利的api添加唯一键索引。下面的代码对我有用
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().Property(p => p.Email).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_EmailIndex") { IsUnique = true }));
}