728x90

기본키를 두개 이상 처리하기 위해선 아래 처럼 Model  정의시 PrimaryKey 를 정의해서 쓰면 됩니다
(.net core 7.0 부터 지원)

[PrimaryKey(nameof(No), nameof(Name))]
internal class User
{
    public int No { get; set; }
    public string Name { get; set; }

    public string? Dept { get; set; }
    public int Age { get; set; }
}


결과


 전체코드

using Microsoft.EntityFrameworkCore;

namespace EFTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            using (var db = new MyDbContext())
            {
                db.Database.EnsureCreated();

                db.Employees.Add(new Employee { Name = "Kang Jun", Age = 40 });

                db.Users.Add(new User { No = 1, Name = "Kang Jun", Dept = "A", Age = 40 });
                db.Users.Add(new User { No = 2, Name = "Danny Jun", Dept = "B", Age = 30 });

                db.SaveChanges();
            }
        }

        public class Employee
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
        }

        [PrimaryKey(nameof(No), nameof(Name))]
        public class User
        {
            public int No { get; set; }
            public string Name { get; set; }

            public string? Dept { get; set; }
            public int Age { get; set; }
        }

        public class MyDbContext : DbContext
        {
            public DbSet<Employee> Employees { get; set; }
            public DbSet<User> Users { get; set; }

            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.UseSqlite("Filename=mydb.db");
            }
        }
    }
}

결과 데이터

 

.NET 6.0 에서는 아래처럼 OnModelCreating 에서 HasKey 에서 처리하면 pk 를 여러개 지정할수 있습니다.

public class AdminUser
{
    public int No { get; set; }
    public string Name { get; set; }

    public string? Dept { get; set; }
    public int Age { get; set; }
}

public class MyDbContext : DbContext
{
    public DbSet<AdminUser> AdminUsers { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Filename=mydb.db");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<AdminUser>().HasKey(d => new { d.No, d.Name });
    }
}

 

참고
https://learn.microsoft.com/ko-kr/ef/core/modeling/keys?tabs=data-annotations

 

키 - EF Core

Entity Framework Core를 사용할 때 엔터티 형식에 대한 키를 구성하는 방법

learn.microsoft.com

 

728x90
Posted by kjun.kr
,