2012-03-04 2 views
1

내가 CodeFirst와 EF 4.3을 사용하고 있는데 나는 이것과 같은 슈퍼/하위 모델이 있습니다EntityFramework 4.3 슈퍼 늦은 초기화

public Person { 
    long Id { get; set; } 
    [Required] 
    string Name { get; set; } 
} 
public Costumer : Person { 
    string SomeData { get; set; } 
    [Required] 
    string SomeRequiredData { get; set; } 
} 

이 문제의 단순화 된 버전입니다. 테이블에는 여러 필드가 있습니다. 신청서의 뒷부분에있는 사람이 Costumer에게 "승격"될 수 있습니다. 따라서 Person이 먼저 생성 된 다음 Customer로 변환됩니다.

질문 : Person을 만든 후에 어떻게 새 Person 레코드를 만들지 않고 (또는 다시 만들지 않고) 공급 업체에 "홍보"할 수 있습니까? 내가 할 경우

var costumer = new Costumer { 
    Id = [same id used before when Person was created], 
    SomeRequiredData = "Data" 
}; 

모델은 그 이름이 필요 없다는 오류를 제공합니다. 원래의 Person 레코드에 이미 있기 때문에 새 공급 업체 인스턴스의 Person에서 필요한 모든 정보를 반복해야 할 필요는 없습니다.

아무도 도와 줄 수 있습니까?

P. 이 모델은 내가 "촉진"하는 방법을 사람을 만든 후

답변

3

그것은 생성 (또는 재창조) 새로운 사람 기록하지 않고 공급 업체에 ... 2 개 별도의 테이블, 각 클래스를 생성하도록 구성되어?

당신은 대부분의 기존 인스턴스의 유형을 변경할 수 없기 때문에 EF와 함께 (당신은 CustomerPerson 캐스팅 할 수없는) 수 없습니다. 엔티티를 캐스팅 할 수 없으므로 EF로 데이터베이스의 유형을 업데이트 할 수도 없습니다. 동시에 인스턴스를 기존 Id으로 삽입 할 수 없으므로이 작업에서는 부모 유형과 하위 유형 모두를 삽입해야합니다 (Customer은 모델에 Person이고 해당 삽입 고객은 Person을 삽입한다는 의미이므로).

도메인 모델이 잘못되어 작동하지 않는 이유는 무엇입니까? OOP에서는 현재 상황을 정확히 의미하므로 CustomerPerson의 하위 유형으로 사용해서는 안됩니다. 새로운 인물 인스턴스를 만들지 않고 (고객이 사람이기 때문에) 사람을 고객으로 변경할 수 없습니다. 이 시나리오를 지원하려면 Person 엔티티 만 있어야하며이 엔티티는 해당 유형을 설명하는 속성을 가져야합니다.

+0

감사합니다 Ladislav, 이것은 실제로 DB 객체에 대한 모델링 문제입니다. 두 개의 테이블이 있지만 데이터베이스의 서로 다른 순간에 두 개의 엔티티가 생성되는 것은 용인 될 수 있지만 OO 모델은 허용되지 않습니다. OO 모델을 변경하여 두 엔티티간에 일대일 관계를 유지하고 문제를 해결했습니다. 알림을 다시 보내 주셔서 감사합니다. –