2010-08-18 4 views
0

나는 EF4 코드만으로 무언가를 찾으려고합니다. TPH를 사용하여 저장된 Person을 Instructor로 변경하거나 그 반대로 변경하려는 경우 어떻게해야합니까? 내 POCO 클래스 : 내가이 사람 관리자를 만들고 싶어에EF4 코드 만 개체의 TPH 변경 유형

var person1 = new Person { FirstName = "Bayram", LastName = "Celik" }; 
context.People.Add(person1); 
context.SaveChanges(); 

나중에 :

public class Person 
{ 
    public int PersonId { get; set; } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 
} 
public class Instructor : Person 
{ 
    public DateTime? HireDate { get; set; } 
} 

public class Student : Person 
{ 
    public DateTime? EnrollmentDate { get; set; } 
} 

public class Admin : Person 
{ 
    public DateTime? AdminDate { get; set; } 
} 

public class PersonConfiguration : EntityConfiguration<Person> 
{ 
    public PersonConfiguration() 
    { 
     this.HasKey(u => u.PersonId).Property(u => u.PersonId).IsIdentity(); 
     MapHierarchy() 
      .Case<Person>(p => new 
      { 
       p.PersonId, 
       p.FirstName, 
       p.LastName,      
       PersonCategory = 0 
      }) 
      .Case<Instructor>(i => new 
      { 

       i.HireDate, 
       PersonCategory = 1 
      }) 
      .Case<Student>(s => new 
      { 
       s.EnrollmentDate, 
       PersonCategory = 2 
      }) 
      .Case<Admin>(a => new 
      { 

       a.AdminDate, 
       PersonCategory = 3 
      }).ToTable("Person"); 

    } 
} 

난 사람이 있다고 할 수 있습니다. 내가 어떻게 이것을 달성 할 수 있을까?

var person = context.People.FirstOrDefault(); 
Admin test = person as Admin; // wont work 

HIREDATE 열을 변경합니다 다음 그러나 나의 판별 필드 PersonCategory는 그래서 EF는

Admin admin = new Admin(); 
admin.PersonId = person.PersonId; 
admin.AdminDate = DateTime.Now; 

context.ObjectContext.Detach(person); 
context.People.Attach(admin); 
var customerEntry = context.ObjectContext.ObjectStateManager.GetObjectStateEntry(admin); 
customerEntry.SetModified(); 
customerEntry.SetModifiedProperty("AdminDate"); 

답변

2

당신은 어느 유형을 변경할 수 없습니다 우려 등의 관리가 지금까지 입력하지 아직도 여전히 0입니다 개체의 당신은 C#에서 그것을 할 수 없으며 EF는이 문제를 해결하지 못합니다. 이것은 OOP의 기본 원칙입니다.

대신 모델 디자인을 수정해야합니다. As I wrote a while back : 좋은 객체 관계형 매핑을 디자인 할 때 당신이 극복해야하는 정신 장애의

하나는 당신의 개성에 맞는 중 주로 객체 지향 용어, 관계형 관점에서 생각하는 경향이다. 좋은 객체 관계형 매핑은 좋은 객체 모델과 좋은 관계형 모델을 모두 포함합니다. 예를 들어 People에 대한 테이블과 Employees 및 Customers에 대한 관련 테이블이있는 데이터베이스가 있다고 가정 해 보겠습니다. 한 사람이 세 테이블 모두에 레코드를 가질 수 있습니다. 엄격한 관계형 관점에서 직원 용 데이터베이스보기와 고객 용 데이터베이스보기를 만들 수 있습니다. 둘 다 People 테이블의 정보를 통합합니다. 하나의 VIEW 또는 다른 VIEW를 사용하는 경우, 개인이 "단지"직원으로 생각하거나 "단지"고객이라고 생각할 때 일시적으로 생각할 수 있습니다. 그래서이 세계관에서 오는 누군가는 Employee와 Customer가 모두 Person의 (직접적인) 서브 클래스 인 OO 매핑을하고 싶을지도 모릅니다. 그러나 이것은 우리가 가지고있는 자료에는 효과가 없습니다. 한 사람이 직원 기록과 고객 기록을 모두 가지고 있으므로 (Person 인스턴스가 Employee와 Customer의 구체적인 하위 유형이 될 수 없기 때문에), Person과 Employee 간의 OO 관계는 상속이 아니라 컴포지션이어야하며 Person과 Customer도 유사해야합니다.

+0

감사합니다. 모든 프레임 워크에서 코드를 가져 왔습니다. http://1code.codeplex.com/. 그리고 내가 시도한 것을 시도하려는 생각에 저항 할 수 없었습니다. – Bcelik

관련 문제