jen*_*ent 3 mapping inheritance table-per-hierarchy entity-framework-4.1
我已经创建了一个非常简单的项目来演示每层次表的不一致性.在我试图生成数据库的单元测试中,我根据配置得到了许多错误之一:
没有Required()方法
Map<InActiveUser>(x => x.Requires("IsActive").HasValue(false));
Map<ActiveUser>(x => x.Requires("IsActive").HasValue(true));
Run Code Online (Sandbox Code Playgroud)
提供:
System.Data.DataException : An exception occurred while initializing the database. See the InnerException for details.
----> System.Data.EntityCommandCompilationException : An error occurred while preparing the command definition. See the inner exception for details.
----> System.Data.MappingException :
(6,10) : error 3032: Problem in mapping fragments starting at line 6:Condition member 'User.IsActive' with a condition other than 'IsNull=False' is mapped. Either remove the condition on User.IsActive or remove it from the mapping.
Run Code Online (Sandbox Code Playgroud)
用Required()方法:
Map<InActiveUser>(x => x.Requires("IsActive").HasValue(false).IsRequired());
Map<ActiveUser>(x => x.Requires("IsActive").HasValue(true).IsRequired());
Run Code Online (Sandbox Code Playgroud)
提供:
System.Data.DataException : An exception occurred while initializing the database. See the InnerException for details.
----> System.Data.EntityCommandCompilationException : An error occurred while preparing the command definition. See the inner exception for details.
----> System.Data.MappingException :
(6,10) : error 3023: Problem in mapping fragments starting at lines 6, 13, 19:Column User.IsActive has no default value and is not nullable. A column value is required to store entity data.
Run Code Online (Sandbox Code Playgroud)
根据我的理解,我们不应该在基类型上定义鉴别器列/属性,但无论是否定义了列,它似乎都没有区别:
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
{
}
Run Code Online (Sandbox Code Playgroud)
您不能将鉴别器映射为实体中的属性.Discriminator定义实体的类型.原因很清楚 - 鉴别器定义了实例类型.如果您能够在运行时更改鉴别器值,会发生什么?.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
{ }
Run Code Online (Sandbox Code Playgroud)
这应该工作:
modelBuilder.Entity<User>()
.Map<InActiveUser>(x => x.Requires("IsActive").HasValue(false))
.Map<ActiveUser>(x => x.Requires("IsActive").HasValue(true));
Run Code Online (Sandbox Code Playgroud)