2013-01-22 1 views
0

T4 (TPH) .xaml (VS) 및 SSDLToSQL10.tt (VS) 템플릿을 사용하여 T-SQL 생성과 함께 Entity 프레임 워크를 사용합니다. I 2 개 사용자 유형을 갖기 때문에 I 테이블SaveChanges가 TPH 엔터티에 작동하지 않습니다.

TABLE [dbo].[Users](
    [UserId] [int] IDENTITY(1,1) NOT NULL, 
    [UserName] [nvarchar](100) NOT NULL, 
    [Password] [nvarchar](50) NOT NULL, 
    [IsPaid] [bit] NOT NULL 

가, 필드 IsPaid가 판별된다. 내 모델에 TPH를 만들었습니다. .TT를 통해 생성 된 클래스의 내가 같은 데이터를 새로운 지불 사용자 (U)을 만들어이 ID 3와 일반 사용자가 있다고 가정하고 저장하려고하자

public abstract partial class User 
    { 
     public User() 
     { 
     } 

     public int UserId { get; set; } 
     public string UserName { get; set; } 
     public string Password { get; set; } 

public partial class RegularUser : User 
{ 
} 

public partial class PaidUser : User 
{ 
} 

    public Container() 
     : base("name=Container") 
    { 
     this.Configuration.LazyLoadingEnabled = false; 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
    } 

    public DbSet<User> Users { get; set; } 

이다.

using (var entities = new Container()) 
      { 
       entities.Entry(u).State = u.UserId == 0 ? EntityState.Added : EntityState.Modified; 
       entities.SaveChanges(); 
      } 

아무런 일도 일어나지 않습니다. 그리고 프로파일 러에서 쿼리가 IsPaid 컬럼을 전혀 사용하지 않는다는 것을 알 수 있습니다. 누구든지 도와 줄 수 있습니까?

답변

1

Id = 3 인 일반 사용자를 Id = 3 인 유료 사용자로 변경하려고합니까? SQL 직접 업데이트를 실행하지 않으면 불가능합니다. EF의 관점에서 엔티티 유형은 영구적입니다. 객체로 작업 할 때와 마찬가지로 동일합니다. 메모리 할당이 다른 새로운 인스턴스 (= 다른 Id)를 만들지 않으면 일반 사용자를 유료 사용자로 "변환"할 수 없습니다.

비즈니스 논리에서 일반 사용자가 EF 상속보다 유료 사용자가 될 것으로 기대하는 경우 솔루션을 사용할 수 없으므로 해결책이 아닙니다. 일반 사용자를 유료 사용자로 "변경"하는 유일한 방법은 유료 사용자의 완전히 새로운 인스턴스를 작성하고 데이터베이스에 삽입하고 일반 사용자의 이전 인스턴스를 삭제하는 것입니다 (모든 관계를 사용자에서 다른 엔터티로 수정해야 함).

관련 문제