2013-10-25 1 views
0

바인딩을 구성하기 위해 Entity Framework와 유창한 API를 사용하고 있습니다. 내 두 단체는 다음과 같다 : 나는 기존의 테이블 스키마와 함께 일하고 있어요, 스키마에 RelativityActivity 테이블은 단순히 MatterId 열을 외부 키를 가지고두 엔티티간에 주체가 1 대 1의 관계를 구성하는 방법은 무엇입니까?

public class Matter 
{ 
    #region Properties 

    /// <summary> 
    /// Primary key 
    /// </summary> 
    public int Id { get; set; } 

    /// <summary> 
    /// Navigation: the most recent Relativity activity for the Matter 
    /// </summary> 
    public virtual RelativityActivity RelativityRecentActivity { get; set; } 

    #endregion 
} 

public class RelativityActivity 
{ 
    #region Properties 

    /// <summary> 
    /// Primary key 
    /// </summary> 
    public int Id { get; set; } 

    /// <summary> 
    /// Foreign key: the Matter that the Relativity Activity entry is associated with 
    /// </summary> 
    public Matter Matter { get; set; } 

    #endregion 
} 

. 따라서 Matter은 관계에있는 주체이며 RelativityActivity없이 존재할 수 있습니다. 하지만 RelativityActivityMatter 없이는 존재할 수 없습니다.

나를 기다리는 동안, 예상대로 작동하도록 구성 할 수 없습니다. 나는 많은 답변을 읽었고, 각 글을 읽은 후에 유창한 API 바인딩을 조정합니다.하지만 나는 "관계의 주된 결론을 결정할 수 없습니다"에서 "잘못된 다중성으로 구성했습니다" .

나의 현재를 유창하게 구사 API 바인딩은 다음과 같이 다음 RelativityActivity에 대한

modelBuilder.Entity<RelativityActivity>().HasRequired(m => m.Matter).WithRequiredDependent(m => m.RelativityRecentActivity).Map(m => m.MapKey("matter")).WillCascadeOnDelete(true); 

하고, 다음 Matter에 대한

modelBuilder.Entity<Matter>().HasOptional(m => m.RelativityRecentActivity).WithRequired(m => m.Matter); 

.

Matter 바인딩이 없기 때문에 주 엔드 오류를 확인할 수 없기 때문에 관계에 두 개의 바인딩이 있습니다. 하지만 이제 다중성에 대한 오류가 발생합니다. 설명에 대한

편집 :

외래 키 열, RelativityActivity 테이블에서 Id 열 수 없습니다. 사실 matter이라는 또 다른 열입니다. 내 바인딩에 Map 함수를 사용하여 이것을 지정하려고합니다.

+0

인가'외국를 RelativityActivity.Id' 관계에 키를 입력하거나, 상대 키인 'RelativityActivity' 테이블에'RelativityActivity.MatterId'와 같은 두 번째 필드가 있습니까? 이것은 답변에 "중요"할 수 있습니다. –

+0

아니요, 외래 키 열은 실제로 "문제"라는 테이블의 다른 열입니다. 제 바인딩에서'Map'을 사용하여 이것을 지정하고 있다고 생각합니다. 그것은 내 의도입니다. – Ryan

답변

1

db 스키마는 0..1 - n 연관 관계 만 적용 할 수 있습니다. 1:1 연관은 항상 상호 참조하는 두 개의 외부 키 또는 동시에 다른 기본 키에 대한 외래 키인 기본 키를 포함합니다. 1 연결 당신이 할 방법 : 1 협회 :

modelBuilder.Entity<Matter>().HasOptional(m => m.RelativityRecentActivity) 
          .WithRequired(m => m.Matter); 

문제는 EF가 데이터베이스 스키마도 1을 수용한다고 가정하는 것입니다을

당신은 일을 모델링 할 수 있습니다. 당신이 MatterRelativityRecentActivity 객체를 저장하려면

, EF는 Matter 레코드를 삽입하고 (그것도의 FK 것으로 가정) RelativityRecentActivity에 대한 PK로 사용하기 위해 PK 값을 취할 것입니다. 따라서 실제 외래 키 필드는 채워지지 않습니다. 그 외에도 RelativityRecentActivity에 자동 증가 PK (Sql Server의 ID 열)가있는 경우 예외가 발생할 수 있습니다.

그래서 당신은 정규 1-many 연관으로 연관을 모델링하고 "많은 사람들이"결코 더 1보다하도록 강제하는 비즈니스 규칙을 사용할 수 있다고 생각 :

modelBuilder.Entity<Matter>().HasMany(m => m.RelativityRecentActivity) 
      .WithRequired(r => r.Matter) 
      .Map(m => m.MapKey("matter"); 
+0

그래서 'RelativityActivity'의 FK와 Matter가 테이블의 PK가되도록 스키마를 조정할 수 있다면 바인딩 논리가 EF에서 작동할까요? – Ryan

+0

물론 스키마를 변경할 수 있다면 원하는 방식으로 매핑 작업을 수행 할 수 있습니다. 어쩌면 가장 쉬운 방법은 EF가 선택한 매핑을 사용하여 데이터베이스를 작성하고 기존 데이터베이스에서이를 복사하는 방법을 확인하는 것일 수 있습니다. –

+0

감사합니다. 스키마를 조정하면이 작업이 가능해졌습니다. 그 말이나 당신이 말한대로! 감사. – Ryan

관련 문제