0

我将实体框架与通过 T4 (TPH).xaml (VS) 和 SSDLToSQL10.tt (VS) 模板生成 T-SQL 一起使用。我有一张桌子

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 列。任何人都可以帮忙吗?

4

1 回答 1

1

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

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

于 2013-01-22T13:09:55.777 回答