programing

먼저 EF 코드를 사용하여 복합 키 매핑

stoneblock 2023. 6. 3. 08:06

먼저 EF 코드를 사용하여 복합 키 매핑

SQL 서버 테이블:

SomeId PK varchar(50) not null 
OtherId PK int not null

먼저 EF6 코드로 어떻게 매핑해야 합니까?

public class MyTable
{
    [Key]
    public string SomeId { get; set; }

    [Key]
    public int OtherId { get; set; }
}

칼럼마다 순서를 정해야 하는 예를 몇 가지 봤는데, 필수인가요?

이것에 대한 공식 문서가 어딘가에 있습니까?

반드시 열 순서를 지정해야 합니다. 그렇지 않으면 SQL Server에서 어떤 순서가 먼저 시작되는지 어떻게 알 수 있습니까?코드에서 수행해야 할 작업은 다음과 같습니다.

public class MyTable
{
  [Key, Column(Order = 0)]
  public string SomeId { get; set; }

  [Key, Column(Order = 1)]
  public int OtherId { get; set; }
}

SO 질문을 볼 수도 있습니다.만약 당신이 공식 문서를 원한다면, 저는 공식 EF 웹사이트를 보는 것을 추천합니다.

편집: 저는 Julie Lerman의 블로그 게시물에서 모든 종류의 EF 6 good에 대한 링크를 발견했습니다.여기서 필요한 것은 무엇이든 찾을 수 있습니다.

엔티티 프레임워크를 사용한 매핑 복합 기본 키의 경우 두 가지 접근 방식을 사용할 수 있습니다.

OnModelCreating() 메서드를 재정의하여

예를 들어, 아래와 같은 VehicleFeature라는 모델 클래스가 있습니다.

public class VehicleFeature
{
    public int VehicleId { get; set; }
    public int FeatureId{get;set;}
    public Vehicle Vehicle{get;set;}
    public Feature Feature{get;set;}
}

제 DB 컨텍스트의 코드는 다음과 같습니다.

public class VegaDbContext : DbContext
{
    public DbSet<Make> Makes{get;set;}

    public DbSet<Feature> Features{get;set;}
    public VegaDbContext(DbContextOptions<VegaDbContext> options):base(options)        
    {           

    }
    // we override the OnModelCreating method here.
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<VehicleFeature>().HasKey(vf=> new {vf.VehicleId, vf.FeatureId});
    }
}

데이터 주석별.

public class VehicleFeature
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]  
    [Key]
    public int VehicleId { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]   
    [Key]
    public int FeatureId{get;set;}
    public Vehicle Vehicle{get;set;}
    public Feature Feature{get;set;}
}

자세한 내용은 아래 링크를 참조하십시오.

1) https://msdn.microsoft.com/en-us/library/jj591617(v=vs.113).aspx

EF6 Fluent API를 사용하여 복합 고유 키를 추가하는 방법은 무엇입니까?

구글 검색 결과 1위인 만큼 이 질문에 추가할 것으로 생각했습니다.

코멘트에서 언급했듯이, EF Core에서는 주석(Key 속성) 사용을 지원하지 않으며 유창하게 수행해야 합니다.

제가 EF6에서 EF Core로 대규모 마이그레이션 작업을 하고 있을 때, 이것은 불쾌했습니다. 그래서 저는 Reflection을 사용하여 Key 속성을 찾은 다음 OnModelCreating 중에 이 속성을 적용하여 해킹을 시도했습니다.

// get all composite keys (entity decorated by more than 1 [Key] attribute
foreach (var entity in modelBuilder.Model.GetEntityTypes()
    .Where(t => 
        t.ClrType.GetProperties()
            .Count(p => p.CustomAttributes.Any(a => a.AttributeType == typeof(KeyAttribute))) > 1))
{
    // get the keys in the appropriate order
    var orderedKeys = entity.ClrType
        .GetProperties()
        .Where(p => p.CustomAttributes.Any(a => a.AttributeType == typeof(KeyAttribute)))
        .OrderBy(p => 
            p.CustomAttributes.Single(x => x.AttributeType == typeof(ColumnAttribute))?
                .NamedArguments?.Single(y => y.MemberName == nameof(ColumnAttribute.Order))
                .TypedValue.Value ?? 0)
        .Select(x => x.Name)
        .ToArray();

    // apply the keys to the model builder
    modelBuilder.Entity(entity.ClrType).HasKey(orderedKeys);
}

저는 이것을 모든 상황에서 완전히 테스트하지는 않았지만, 기본적인 테스트에서는 작동합니다.이것이 누군가에게 도움이 되기를 바랍니다.

구성을 통해 다음 작업을 수행할 수 있습니다.

Model1
{
    int fk_one,
    int fk_two
}

Model2
{
    int pk_one,
    int pk_two,
}

그러면 컨텍스트 구성에서

public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Model1>()
            .HasRequired(e => e.Model2)
            .WithMany(e => e.Model1s)
            .HasForeignKey(e => new { e.fk_one, e.fk_two })
            .WillCascadeOnDelete(false);
    }
}

사용할 수 있습니다.PrimaryKeyEF7의 속성입니다.[PrimaryKey] 특성은 EF Core 7.0에 도입되었습니다.이전 버전에서는 Fluent API를 사용합니다.

:

[PrimaryKey(nameof(State), nameof(LicensePlate))]
internal class Car
{
    public string State { get; set; }
    public string LicensePlate { get; set; }

    public string Make { get; set; }
    public string Model { get; set; }
}

참조: https://learn.microsoft.com/en-us/ef/core/modeling/keys?tabs=data-annotations

언급URL : https://stackoverflow.com/questions/19792295/mapping-composite-keys-using-ef-code-first