반응형
외래 키로 복합 키
MVC 3 응용 프로그램에서 Entity Framework 4.1을 사용하고 있습니다. 기본 키가 두 개의 열 (복합 키)로 구성된 엔터티가 있습니다. 그리고 이것은 다른 엔티티에서 외래 키로 사용됩니다. 관계를 만드는 방법? 일반적인 scnerios에서는 다음을 사용합니다.
public class Category
{
public string CategoryId { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public string CategoryId { get; set; }
public virtual Category Category { get; set; }
}
하지만 카테고리에 두 개의 열 키가 있으면 어떻게 될까요?
유창한 API를 사용할 수 있습니다.
public class Category
{
public int CategoryId1 { get; set; }
public int CategoryId2 { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public int CategoryId1 { get; set; }
public int CategoryId2 { get; set; }
public virtual Category Category { get; set; }
}
public class Context : DbContext
{
public DbSet<Category> Categories { get; set; }
public DbSet<Product> Products { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Category>()
.HasKey(c => new {c.CategoryId1, c.CategoryId2});
modelBuilder.Entity<Product>()
.HasRequired(p => p.Category)
.WithMany(c => c.Products)
.HasForeignKey(p => new {p.CategoryId1, p.CategoryId2});
}
}
또는 데이터 주석 :
public class Category
{
[Key, Column(Order = 0)]
public int CategoryId2 { get; set; }
[Key, Column(Order = 1)]
public int CategoryId3 { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
public class Product
{
[Key]
public int ProductId { get; set; }
public string Name { get; set; }
[ForeignKey("Category"), Column(Order = 0)]
public int CategoryId2 { get; set; }
[ForeignKey("Category"), Column(Order = 1)]
public int CategoryId3 { get; set; }
public virtual Category Category { get; set; }
}
가장 쉬운 방법은 다음과 같이 Navigation 속성에 데이터 주석을 사용하는 것입니다. [ForeignKey("CategoryId1, CategoryId2")]
public class Category
{
[Key, Column(Order = 0)]
public int CategoryId1 { get; set; }
[Key, Column(Order = 1)]
public int CategoryId2 { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
public class Product
{
[Key]
public int ProductId { get; set; }
public string Name { get; set; }
public int CategoryId1 { get; set; }
public int CategoryId2 { get; set; }
[ForeignKey("CategoryId1, CategoryId2")]
public virtual Category Category { get; set; }
}
참고 URL : https://stackoverflow.com/questions/5436731/composite-key-as-foreign-key
반응형
'Nice programing' 카테고리의 다른 글
Visual Studio 2008 테스트 프레임 워크에서 배열이 동일한 지 확인 (0) | 2020.10.09 |
---|---|
내 Linux C ++ 프로그램에서 코어 덤프를 활성화하는 방법 (0) | 2020.10.09 |
grep 출력에 파일 이름 및 줄 번호 표시 (0) | 2020.10.09 |
Python Regex는 즉시 그룹을 대체합니다. (0) | 2020.10.09 |
동일한 파일에서 프로젝트 이름 / 그룹 / 버전과 {source, target} 호환성을 설정하는 방법은 무엇입니까? (0) | 2020.10.09 |