3

유형별 상속을 사용하여 Entity Framework에서 모델을 정의 할 때 person이라는 기본 클래스/테이블 (추상이 아님)과 두 개의 하위 엔티티 및 테이블 , 어른과 아이, 아이를 만들었을 때, 나는 어떻게 같은 물건을 가져다가 어른으로 바꾸겠습니까? 일단 성인으로 변환되면 개인 테이블의 기본 클래스 데이터는 그대로 유지해야하지만 하위 레코드는 삭제해야합니다.유형별 상속 테이블이있는 Entity Framework 모델

답변

4

불가능합니다. here과 비슷한 문제입니다. 단순히 엔티티가 존재하며 그 유형은 변경 불가능합니다. 이를 수행하는 유일한 방법은 하위 엔티티 (= 두 테이블의 레코드)를 삭제하고 새로운 성인 엔티티 (= 두 테이블의 새 레코드)를 생성하는 것입니다.

상속에 대한 시나리오처럼 보이지 않습니다.

편집 :

상속에 대한 의견은 당신이 Person, AdultChild 실체를 언급 한 시나리오를 대상으로 한

. 어쨌든 시나리오에서 유형을 변경할 수있게되면 변경할 수있는 부분이 구성에 의해 처리되는 다른 솔루션에 대해 생각해야합니다. 예를 들어

:

public class DataSource 
{ 
    public int Id { get; set; } 
    public virtual DataSourceFeatures Features { get; set; } 
} 

public class DataSourceFeatures 
{ 
    [Key, ForeignKey("DataSource")] 
    public int Id { get; set; } 
    public virtual DataSource DataSource { get; set; } 
} 

public class XmlDataSourceFeatures : DataSourceFeatures { ... } 

public class DelimitedDataSourceFeatures : DataSourceFeatures { ... } 

public class ServiceDataSourceFeatures : DataSourceFeatures { ... } 

지금 유형을 변경하면 데이터베이스에 의존하는 현재의 DataSourceFeatures을 삭제하는 것을 의미하고 새를 만들 수 있지만, 원래의 객체가 동일하게 유지 - 단지 관련 변경.

+0

Datasource라는 기본 클래스와 몇 가지 파생 클래스 인 XmlSource, DelimitedSource, ServiceSource 등이 있습니다. 파생 클래스 각각에는 특정 속성이 있지만 이름, 설명 등은 모두 공통 필드를 공유합니다. 상속에 대한 시나리오처럼 보이지 않는 Db에 데이터를 저장하는 관점? 파생 클래스 속성을 직렬화하고 데이터 소스 테이블에 저장하는 것도 고려했지만 XML 대신 테이블을 사용하는 것이 좋습니다. 필자의 경우 사용자는 데이터 소스 유형을 XML에서 Delimited로 변경할 수 있습니다. – mservidio

+0

업데이트 된 답변을 보내 주셔서 감사합니다. 네 접근 방식이 좋아.나는 이것이 원래 더 잘 작동한다고 생각하지만 원래이 방식으로 생각하지 않았습니다. – mservidio

3

상속을 사용하면 다른 형식에서 변환 할 수없는 테이블 관계에 대한 개체 지향 추상화를 만들었 기 때문에 EF에서는이 작업을 수행하지 않습니다. OO에서는 다음과 같은 일을 할 수 없습니다.

Child child = new Child(); 
Adult grownUp = child; 

그런 다음 자녀가 성인이 될 것으로 기대하십시오. 다음과 같이하면됩니다 :

Child child = new Child(); 
Adult grownUp = child.GrowUp(); 

따라서 SQL Server를 사용한다고 가정하면 저장 프로 시저를 사용할 수 있습니다. GrowUp (child)와 같은 기능을 제공하고 Child 테이블의 항목을 삭제할뿐만 아니라 Person 테이블을 그대로 유지하면서 Adult 테이블에 새 항목을 만들게합니다. 프로 시저에서 새 성인 개체를 반환 할 수 있습니다.

Adult grownUp = context.GrowUp(child); 

그러나이 줄 끝에서 더 이상 자식 객체를 사용하지 않는 것이 코드에서 확인해야 할 것입니다 그리고 당신은 아마 새로 고침 또는에서 제거해야합니다 이것은 다음과 같이 사용할 수 있습니다 컨텍스트 (이것에 관해서는 확실하지 않음).

+0

나는 당신의 생각을 좋아합니다. 이 아이디어를 한 걸음 더 나아가 기 위해 generics를 사용하여 파생 된 객체를 기본 클래스로 캐스팅하고 새로운 파생 클래스를 인스턴스화 할 수있었습니다. 물론 파생 클래스 속성은 하위 클래스에만 적용되므로 항상 손실됩니다.하지만 괜찮습니다. 또한 제네릭을 사용하여 이전 파생 개체를 제거하고 db에서 레코드를 만들고 새 파생 클래스로 새 개체를 만들 수 있습니다. – mservidio

관련 문제