首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SaveChanges不适用于TPH实体

SaveChanges不适用于TPH实体
EN

Stack Overflow用户
提问于 2013-01-22 17:28:39
回答 1查看 185关注 0票数 0

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

代码语言:javascript
复制
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生成的类包括

代码语言:javascript
复制
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,并尝试保存它。

代码语言:javascript
复制
using (var entities = new Container())
            {
                entities.Entry(u).State = u.UserId == 0 ? EntityState.Added : EntityState.Modified;
                entities.SaveChanges();
            }

什么都没发生。我可以从分析器中看到,该查询根本没有使用IsPaid列。有人能帮上忙吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-22 21:09:56

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14455272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档