SaveChanges不适用于TPH实体

时间:2013-01-22 09:28:39

标签: entity-framework poco table-per-hierarchy

我使用Entity框架和Generate T-SQL Via T4(TPH).xaml(VS)和SSDLToSQL10.tt(VS)模板。 我有一张桌子

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 个答案:

答案 0 :(得分:1)

您是否尝试将Id = 3的普通用户更改为ID = 3的付费用户?如果不执行直接SQL更新,这是不可能的。从EF的角度来看,实体类型是永久性的。它与使用对象时相同 - 您无法将常规用户“转换”为付费用户,而无需创建具有不同内存分配的全新实例(=不同的Id)。

如果您的业务逻辑期望普通用户可以成为付费用户而不是EF继承不是解决方案,因为它无法做到这一点。将常规用户“更改”为付费用户的唯一方法是创建付费用户的全新实例,将其插入数据库并删除常规用户的旧实例(确保您还必须修复从用户到其他实体的所有关系)。