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 () 설명을 사용하면 더 명확 해집니다.