Question

J'ai créé un projet très simple pour démontrer l'inhertiance de table par hiérarchie. Dans mon test unitaire qui essaie de générer la base de données, j'obtiens l'une des nombreuses erreurs en fonction de la configuration:

sans le Required() méthode

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

Livre:

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.

avec le Required() méthode:

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

Map<ActiveUser>(x => x.Requires("IsActive").HasValue(true).IsRequired());

Livre:

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.

D'après ce que je comprends, nous ne devons pas définir la colonne / la propriété discriminatrice sur le type de base, mais de toute façon il semble ne faire aucune différence avec ou sans la colonne définie:

  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
  {
  }
Était-ce utile?

La solution

Vous ne pouvez pas cartographier le discriminateur comme propriété dans l'entité. Le discriminateur définit le type de l'entité. La raison est claire - le discriminateur définit le type instancié. Que devrait-il arriver si vous pouviez modifier la valeur du discriminateur au moment de l'exécution? Comment .NET devrait-il modifier le type d'objet instancié?

Définir les entités comme:

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
{ }

Et cela devrait fonctionner:

modelBuilder.Entity<User>()
            .Map<InActiveUser>(x => x.Requires("IsActive").HasValue(false))
            .Map<ActiveUser>(x => x.Requires("IsActive").HasValue(true));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top