我使用实体框架和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因为我有两个用户类型,所以字段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列。有人能帮上忙吗?
发布于 2013-01-22 21:09:56
您是否正在尝试将Id = 3的普通用户更改为Id =3的付费用户?如果不直接执行SQL update,这是不可能的。从EF的角度来看,实体类型是永久的。这就像你使用对象时一样--你不能把普通用户“转换”成付费用户,而不是创建一个全新的实例,它会有不同的内存分配(=不同的Id)。
如果您的业务逻辑期望普通用户可以成为付费用户,那么EF继承就不是一个解决方案,因为它无法做到这一点。将普通用户“改变”为付费用户的唯一方法是创建付费用户的全新实例,将其插入数据库并删除常规用户的旧实例(当然,您还必须修复从用户到其他实体的所有关系)。
https://stackoverflow.com/questions/14455272
复制相似问题