EF의 최신 버전에서는 FK가 PK를 가리 키도록 요구하기 때문에 쉽게 해결할 수있는 문제는 아닙니다.
내가 사용한 적이있는 한 가지 기술은 부모 테이블의 매핑에서 PKEY를 무시하고 대신 익명 형식을 지정하는 것입니다 (EF CodeFirst ... er ... 둘째). 이 위해서는
public class ParentObject
{
public int Id {get; set;} //the actual PKEY in the Db
public string CandidateKey1 {get;set;}
public string CandidateKey2 {get;set;}
public string CandidateKey3 {get;set;}
public virtual ICollection<ChildObject> ChildObjects {get;set;}
}
public class ChildObject
{
public int Id {get; set;}
public string CandidateKey1 {get;set;}
public string CandidateKey2 {get;set;}
public string CandidateKey3 {get;set;}
public virtual ParentObject ParentObject {get;set;}
}
당신은 부모 테이블의 PKEY 실제로 DB에 저장 익명의 객체가 아닌 PKEY로 지정해야합니다 작동합니다.
public ParentObjectMap()
{
// Primary Key
//this.HasKey(t => t.Id); //override this as PKEY for EF purposes
this.HasKey(t => new { t.CandidateKey1, t.CandidateKey2, t.CandidateKey3 });
// Table & Column Mappings
this.ToTable("ParentTable");
this.Property(t => t.Id).HasColumnName("ParentId");
this.Property(t => t.CandidateKey1).HasColumnName("Key1");
this.Property(t => t.CandidateKey2).HasColumnName("Key2");
this.Property(t => t.CandidateKey3).HasColumnName("Key3");
}
와 자식 객체 맵 물론
public ChildObjectMap()
{
// Primary Key
this.HasKey(t => t.Id);
// Table & Column Mappings
this.ToTable("ChildTable");
this.Property(t => t.Id).HasColumnName("ChildId");
this.Property(t => t.CandidateKey1).HasColumnName("Key1");
this.Property(t => t.CandidateKey2).HasColumnName("Key2");
this.Property(t => t.CandidateKey3).HasColumnName("Key3");
this.HasRequired(t => t.ParentObject)
.WithMany(t => t.ChildObjects)
.HasForeignKey(t => new { t.CandidateKey1, t.CandidateKey2, t.CandidateKey3 });
}
, 이것은 당신이 구현 코드를 처리하는 데 필요한 실제 부모 Id 속성의 uniqueueness과 같은 다른 문제를 소개합니다. 그러나이 기술은 비슷한 (후보 키가있는) Progress 4GL OpenEdge -> MSSQL db에 대해 코드를 작성할 때 나에게 도움이되었습니다.
DB에서 FK 관계를 활용하는 네이티브 EF -> MSSQL 매핑과 거의 비슷합니다.
죄송합니다. 각 테이블에는 기본 키와 하나 이상의 후보 키가 있습니다. 관련 테이블에서 외래 키로 사용되는 후보 키입니다. – Mikey