我使用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列。有人可以帮忙吗?
答案 0 :(得分:1)
您是否尝试将Id = 3的普通用户更改为ID = 3的付费用户?如果不执行直接SQL更新,这是不可能的。从EF的角度来看,实体类型是永久性的。它与使用对象时相同 - 您无法将常规用户“转换”为付费用户,而无需创建具有不同内存分配的全新实例(=不同的Id)。
如果您的业务逻辑期望普通用户可以成为付费用户而不是EF继承不是解决方案,因为它无法做到这一点。将常规用户“更改”为付费用户的唯一方法是创建付费用户的全新实例,将其插入数据库并删除常规用户的旧实例(确保您还必须修复从用户到其他实体的所有关系)。