I created a very simple project to demonstrate hierarchy inheritance. In my unit test, which is trying to generate a database, I get one of several errors depending on the configuration:
no method Required()
Map<InActiveUser>(x => x.Requires("IsActive").HasValue(false));
Map<ActiveUser>(x => x.Requires("IsActive").HasValue(true));
provides:
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.
using the method Required():
Map<InActiveUser>(x => x.Requires("IsActive").HasValue(false).IsRequired());
Map<ActiveUser>(x => x.Requires("IsActive").HasValue(true).IsRequired());
provides:
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.
From what I understand, we should not define the column / property of the discriminator in the base type, but in any case, it does not make any difference with or without the definition of the column:
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; }
}
public class InActiveUser : User
{
public virtual DateTime DeActivatedDate { get; set; }
}
public class ActiveUser : User
{
}
source
share