Inheritance EF4.1使用每个层次结构继承的表创建数据库时发生异常

Inheritance EF4.1使用每个层次结构继承的表创建数据库时发生异常,inheritance,entity-framework-4.1,mapping,table-per-hierarchy,Inheritance,Entity Framework 4.1,Mapping,Table Per Hierarchy,我创建了一个非常简单的项目来演示每个层次结构的表。在我尝试生成数据库的单元测试中,根据配置的不同,我会出现以下错误之一: 没有Required()方法 Map<InActiveUser>(x => x.Requires("IsActive").HasValue(false)); Map<ActiveUser>(x => x.Requires("IsActive").HasValue(true)); 使用Required()方法: Map<InActiv

我创建了一个非常简单的项目来演示每个层次结构的表。在我尝试生成数据库的单元测试中,根据配置的不同,我会出现以下错误之一:

没有
Required()
方法

Map<InActiveUser>(x => x.Requires("IsActive").HasValue(false));
Map<ActiveUser>(x => x.Requires("IsActive").HasValue(true));
使用
Required()
方法:

Map<InActiveUser>(x => x.Requires("IsActive").HasValue(false).IsRequired());

Map<ActiveUser>(x => x.Requires("IsActive").HasValue(true).IsRequired());
据我所知,我们不应该在基类型上定义鉴别器列/属性,但无论采用哪种方式,它似乎与定义的列或未定义的列没有区别:

  public class User
  {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int Id { get; set; }

    [Required]
    public virtual string Username { get; set; }

    [Required]
    [DefaultValue(true)]
    public bool IsActive { get; set; } //have tried without this property
  }

  public class InActiveUser : User
  {
    public virtual DateTime DeActivatedDate { get; set; }
  }

  public class ActiveUser : User
  {
  }

不能将鉴别器映射为实体中的属性。鉴别器定义实体的类型。原因很清楚-鉴别器定义实例类型。如果您能够在运行时更改鉴别器值,会发生什么情况?.NET应该如何更改实例化对象的类型

将实体定义为:

public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int Id { get; set; }

    [Required]
    public virtual string Username { get; set; }
}

public class InActiveUser : User
{
    public virtual DateTime DeActivatedDate { get; set; }
}

public class ActiveUser : User
{ }
这应该是可行的:

modelBuilder.Entity<User>()
            .Map<InActiveUser>(x => x.Requires("IsActive").HasValue(false))
            .Map<ActiveUser>(x => x.Requires("IsActive").HasValue(true));
modelBuilder.Entity()
.Map(x=>x.Requires(“IsActive”).HasValue(false))
.Map(x=>x.Requires(“IsActive”).HasValue(true));

我运行这段代码,它可以正常工作,因此您的问题中必须包含其他内容。如果您在新项目中仅使用这段代码(正如我所做的),它是否正常工作?我尝试过这一点“据我所知,我们不应在基类型上定义鉴别器列/属性”,事实证明,该数据库已创建,但处于半切状态。一旦我删除了它,并且在没有Required()方法和discriminator属性的情况下运行了它,它就成功了。如果有人在设计器中遇到这个问题,这个答案也适用于那里。鉴别器不应在基类中用作属性。刚刚发现多亏了这个。
public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int Id { get; set; }

    [Required]
    public virtual string Username { get; set; }
}

public class InActiveUser : User
{
    public virtual DateTime DeActivatedDate { get; set; }
}

public class ActiveUser : User
{ }
modelBuilder.Entity<User>()
            .Map<InActiveUser>(x => x.Requires("IsActive").HasValue(false))
            .Map<ActiveUser>(x => x.Requires("IsActive").HasValue(true));