实体框架核心首先添加唯一约束代码

Vad*_*m M 112 c# entity-framework entity-framework-core

我找不到为我的field属性添加唯一约束的方法

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; }
}
Run Code Online (Sandbox Code Playgroud)

我在用

 "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",
Run Code Online (Sandbox Code Playgroud)

Sam*_*ath 222

在EF核心上,您无法使用数据注释创建索引.但您可以使用Fluent API执行此操作.

在你的内心像这样{Db}Context.cs:

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<User>()
        .HasIndex(u => u.Email)
        .IsUnique();
}
Run Code Online (Sandbox Code Playgroud)

...或者如果你在buildAction中使用了重载:

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<User>(entity => {
        entity.HasIndex(e => e.Email).IsUnique();
    });
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读更多相关信息:索引

  • 此代码不适用于string类型的列:(有没有办法在字符串列上添加唯一约束? (4认同)
  • 寻找“HasAlternateKey” (3认同)

Hos*_*Rad 53

此外,如果您想在多个列上创建唯一约束,您可以简单地执行此操作(遵循@ Sampath的链接)

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; }
}
Run Code Online (Sandbox Code Playgroud)


小智 14

从 Entity Framework Core (EF Core) 5.0 开始,我们可以通过 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; }
}
Run Code Online (Sandbox Code Playgroud)

有关索引和数据注释的更多信息,请参阅:https : //docs.microsoft.com/en-us/ef/core/modeling/indexes?tabs= data-annotations

  • “Index”属性位于命名空间“Microsoft.EntityFrameworkCore”上,并且需要“Microsoft.EntityFrameworkCore”nuget 包。我将模型和 DbContext 放在不同的项目上,并且很难找到它,认为它位于“System.ComponentModel.DataAnnotations”上(事实并非如此)。 (7认同)

Jus*_*bbs 7

OP 询问是否可以将属性添加到实体类中作为唯一键。简而言之,这是可能的,但不是 EF Core 团队开箱即用的功能。如果您想使用属性将唯一键添加到 Entity Framework Core 实体类,您可以执行我在此处发布的操作

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; }
}
Run Code Online (Sandbox Code Playgroud)

  • 那太棒了。能不能贴一下你开发的自定义属性的代码?! (4认同)

val*_*asm 6

通过模型配置在 EF 核心中使用它

public class ApplicationCompanyConfiguration : IEntityTypeConfiguration<Company>
{
    public void Configure(EntityTypeBuilder<Company> builder)
    {
        builder.ToTable("Company"); 
        builder.HasIndex(p => p.Name).IsUnique();
    }
}
Run Code Online (Sandbox Code Playgroud)


Evg*_*nko 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})
    }
}
Run Code Online (Sandbox Code Playgroud)

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)
);
Run Code Online (Sandbox Code Playgroud)

参考EF核心文档

  • 根据EF Core docs:`如果你只想强制列的唯一性,那么你需要一个唯一的索引而不是一个备用键.在EF中,备用键提供比唯一索引更多的功能,因为它们可以用作外键的目标 (7认同)

kdg*_*ang 5

Ef 核心支持独特的配置。

protected override void OnModelCreating(ModelBuilder builder)
{
  builder.Entity<Account>()
    .HasIndex(account => account.Email)
      .IsUnique();
}
Run Code Online (Sandbox Code Playgroud)

ef core 支持多个唯一键

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  modelBuilder.Entity<Account>()
      .HasKey(account => new { account.Id, account.Email, account.RoleId });
}
Run Code Online (Sandbox Code Playgroud)

不要忘记运行 ef core 命令来进行迁移和更新数据库

>> dotnet ef migrations add MigrationName -c YourDbContextName
>> dotnet ef database update -c YourDbContextName
Run Code Online (Sandbox Code Playgroud)