2013-01-22 81 views
0

我使用通过T4(TPH).xaml(VS)和SSDLToSQL10.tt(VS)模板生成T-SQL的实体框架。 我有一个表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 

由于我有2种用户类型,字段IsPaid是鉴别器。我在我的模型中创建了TPH。通过.TT生成的类

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; } 

比方说,我有一个ID 3.定期用户创建一个新的付费用户u使用相同的数据,并尝试将其保存。

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继承不是一个解决方案,因为它不能这样做。将常规用户“更改”为付费用户的唯一方法是创建付费用户的全新实例,将其插入数据库并删除常规用户的旧实例(确保您还必须修复从用户到其他实体的所有关系)。