IT

Entity Framework Core는 고유 한 제약 조건 코드 우선 추가

lottoking 2020. 8. 7. 07:45
반응형

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 Core 문서 참조


이 모든 솔루션을 시도했지만 작동하지 않는 사람을 위해 솔루션을 시도합니다.

protected override void OnModelCreating(ModelBuilder builder)
{

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

}

OP는 고유 키에 대한 엔티티 클래스에 속성을 추가 할 수 있는지 여부를 묻습니다. 짧은 대답은 가능하지만 EF Core Team의 기본 기능이 아니라는 것입니다. 특성을 사용하여 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; }
}

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

이렇게하면 데이터베이스에 필요한 고유 인덱스가 추가됩니다. 하지만 사용자 지정 오류 메시지를 지정하는 기능을 제공하지 않습니다.


유창한 API를 사용하여 고유 키 인덱스를 추가 할 수 있습니다. 아래 코드는 나를 위해 일했습니다.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<User>().Property(p => p.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();
    }
}

참고 URL : https://stackoverflow.com/questions/41246614/entity-framework-core-add-unique-constraint-code-first

반응형