[C#] 엔터티 프레임 워크에서 1 : 1 관계에서 연결의 주요 끝은 무엇을 의미합니까?

public class Foo
{
    public string FooId{get;set;}
    public Boo Boo{get;set;}
}


public class Boo
{
    public string BooId{get;set;}
    public Foo Foo{get;set;}
}

오류가 발생했을 때 Entity Framework 에서이 작업을 수행하려고했습니다.

‘ConsoleApplication5.Boo’및 ‘ConsoleApplication5.Foo’유형 간 연관의 주요 끝을 판별 할 수 없습니다. 이 연결의 주요한 끝은 관계 유창 API 또는 데이터 주석을 사용하여 명시 적으로 구성해야합니다.

이 오류에 대한 해결책으로 StackOverflow에서 질문을 보았지만 “주요 목적”이라는 용어의 의미를 이해하고 싶습니다.



답변

일대일 관계에서 한쪽 끝은 기본이고 다른 쪽 끝은 종속적이어야합니다. 기본 끝은 먼저 삽입되고 종속 끝없이 존재할 수있는 끝입니다. 종속 엔드는 프린시 펄에 대한 외부 키가 있으므로 프린시 펄 뒤에 삽입해야하는 엔드 포인트입니다.

엔티티 프레임 워크의 경우 종속적 인 FK도 PK이어야하므로 귀하의 경우 다음을 사용해야합니다.

public class Boo
{
    [Key, ForeignKey("Foo")]
    public string BooId{get;set;}
    public Foo Foo{get;set;}
}

또는 유창한 매핑

modelBuilder.Entity<Foo>()
            .HasOptional(f => f.Boo)
            .WithRequired(s => s.Foo);


답변

[Required]데이터 주석 속성을 사용하여 이를 해결할 수도 있습니다 .

public class Foo
{
    public string FooId { get; set; }

    public Boo Boo { get; set; }
}

public class Boo
{
    public string BooId { get; set; }

    [Required]
    public Foo Foo {get; set; }
}

Foo에 필요합니다 Boo.


답변

이것은 일대일 관계를 구성하기 위해 유창한 API를 사용하는 것에 대한 @Ladislav Mrnka의 답변과 관련이 있습니다.

FK of dependent must be it's PK가능하지 않은 상황이 있었습니다.

예를 들어 Foo이미와 일대 다 관계가 Bar있습니다.

public class Foo {
   public Guid FooId;
   public virtual ICollection<> Bars;
}
public class Bar {
   //PK
   public Guid BarId;
   //FK to Foo
   public Guid FooId;
   public virtual Foo Foo;
}

이제 Foo와 Bar간에 일대일 관계를 추가해야했습니다.

public class Foo {
   public Guid FooId;
   public Guid PrimaryBarId;// needs to be removed(from entity),as we specify it in fluent api
   public virtual Bar PrimaryBar;
   public virtual ICollection<> Bars;
}
public class Bar {
   public Guid BarId;
   public Guid FooId;
   public virtual Foo PrimaryBarOfFoo;
   public virtual Foo Foo;
}

유창한 API를 사용하여 일대일 관계를 지정하는 방법은 다음과 같습니다.

modelBuilder.Entity<Bar>()
            .HasOptional(p => p.PrimaryBarOfFoo)
            .WithOptionalPrincipal(o => o.PrimaryBar)
            .Map(x => x.MapKey("PrimaryBarId"));

PrimaryBarId유창한 API를 통해 추가하는 동안 추가 를 제거해야합니다.

또한 메소드 이름 [WithOptionalPrincipal()][1]은 역설적입니다. 이 경우 교장은 바입니다. msdn에 OptionalDependent () 설명을 사용하면 더 명확 해집니다.


답변