2016-12-07 3 views
0

없이 Foo의 필수 속성을 엔티티 프레임 워크 필수 속성은 관계

class Foo() 
{ 
    Guid FooId; 
    Bar Bar; 
} 

class Bar() 
{ 
    Guid BarId; 
} 

Bar

을 감안할하지만 FooBar 사이에 데이터베이스 관계가 없습니다. FooBar을 할당하면 Foo을 삭제하지 않고 해당 데이터베이스에서 Bar을 삭제해도됩니다.

유창한 API에서 어떻게 구성 되나요? 내가하려고하면 내가 entity.HasOne(e => e.Bar).WithMany().IsRequired(); 엔티티 프레임 워크가 FooBar 사이의 데이터베이스에서 관계를 생성하려고하면

entity.Property(e => e.Bar) 
    .IsRequired(); 

엔티티 프레임 워크 마이그레이션 오류를

The property 'Bar' cannot be added to the entity type 'Foo' because a navigation property with the same name already exists on entity type 'Foo' 

가 발생합니다.

Bar은 (는) 관련성을 나타내지 않고 Foo의 필요한 속성을 만들어냅니다.

답변

1

옵션 중 하나

class Foo() 
{ 
    Guid FooId; 
    Guid BarId; 
} 

없음 객체 참조 - 아무 관계. Guid는 기본적으로 필요하므로 추가 구성이 필요하지 않습니다. 이 BarId가있는 Bar 레코드가없는 경우에도 여기에 값을 입력 할 수 있습니다.

옵션

당신을 위해

다른 방법은 참조 무결성을 강제로 관계를 가지고/만드는 것입니다,하지만, cascade 옵션 SetNull 두 : 당신은 DB

fooEntity.HasOne(x => x.Bar).WithMany().OnDelete(DeleteBehavior.SetNull); 

이 (당신이 확인해야합니다입니다 공급자/엔진 지원)는 Bar을 삭제하면 Foo을 삭제하지 않습니다. 대신 Foo.BarIdnull으로 설정됩니다. 물론, 이로 인해 Foo 테이블의 BarId 필드에 Nullable 열 유형이 생깁니다.

+0

그래서 @Dmitry 우리는'Foo.Bar'를 사용하여 탐색 할 수 있기를 원한다면 관계가 있어야합니다. – Vague

+0

예. DB에 관계가 있고 (또는 EF가 그것에 대해 알고 있고 도움이되는) 관계가 없거나 객체간에 이동하고 "수동으로" "무결성을 적용"합니다. – Dmitry

+1

한 메모 더. 'DeleteBehavior.SetNull' 액션이 있습니다 - 앱이'Bar' 레코드가 삭제 될 때 앱이'Foo.BarId'를 null로 설정하면 괜찮습니다 -이 행동 값과 관계를 만들 수 있습니다. – Dmitry