0

MVC3 및 웹 개발의 전반적인 초보자입니다.(MVC3/Entity Framework) 후보 키를 외래 키로 사용하는 데이터베이스에서 CRUD 작업을 수행하는 방법

내 클라이언트 데이터베이스는 한 테이블의 고유 후보 키를 다른 테이블의 외래 키로 사용합니다. 나는 데이터베이스가 설계된 방식을 바꿀 수 없다. 데이터베이스 테이블에서 파생 된 모델이 있습니다. Entity Framework가 후보 키를 다른 테이블의 외래 키로 지원하지 않는다는 것을 알고 있습니다.

내 질문은, 어떻게 엔터티 프레임 워크의 한계를 해결하기 위해 전문가가 작동합니까?

+0

죄송합니다. 각 테이블에는 기본 키와 하나 이상의 후보 키가 있습니다. 관련 테이블에서 외래 키로 사용되는 후보 키입니다. – Mikey

답변

0

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 매핑과 거의 비슷합니다.

+0

2011 년 현재 Microsoft에서이 문제에 대한 작업을하고 있지만 ("고유성 제약 조건") 업데이트 된 블로그 게시물은 EF 5에서 연기되었음을 보여줍니다. http://blogs.msdn.com/b/efdesign/archive/2011/03/ 09/unique-constraints-in-the-entity-framework.aspx –

+0

답변 해 주셔서 감사합니다. 나는 그것을 시도 할 것이다. 필자의 초기 작업은 이러한 테이블을 별도의 연결되지 않은 테이블로 취급 한 다음 AJAX 및 LINQ를 사용하여 where 절을 사용하여 데이터를 가져 왔지만 그 아이디어가 마음에 들지 않았습니다. – Mikey