[C#] Entity Framework Core는 고유 제약 조건 코드 우선 추가

속성을 사용하여 필드에 고유 제약 조건을 추가하는 방법을 찾을 수 없습니다.

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",



답변

EF core에서는 데이터 주석을 사용하여 인덱스를 만들 수 없지만 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();
    });
}

당신은 여기에 대한 자세한 내용을보실 수 있습니다 : 인덱스


답변

또한 여러 열에 고유 제약 조건을 만들려면 간단하게 수행 할 수 있습니다 (@ 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; }
}


답변

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)
);

EF 핵심 문서 참조


답변

OP는 고유 키의 Entity 클래스에 속성을 추가 할 수 있는지 묻고 있습니다. 짧은 대답은 가능하지만 EF 핵심 팀의 기본 기능은 아닙니다. 속성을 사용하여 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; }
}


답변

이 모든 솔루션을 시도했지만 작동하지 않는 사람은이 솔루션을 사용했습니다.

protected override void OnModelCreating(ModelBuilder builder)
{

    builder.Entity<User>().Property(t => t.Email).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_EmailIndex") { IsUnique = true }));

}


답변

모델 구성을 통해 EF 코어에서 사용하려면

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


답변

이러한 방법 중 어느 것도 .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 });
        }
    }

데이터베이스에 필요한 고유 인덱스가 추가됩니다. 그러나 수행하지 않는 것은 사용자 정의 오류 메시지를 지정하는 기능을 제공하는 것입니다.