2017-09-15 6 views
0

J'expérimente l'utilisation des classes d'énumération (link) à la place et enums et "tables de recherche".AutoMapping Enumeration Class

J'ai ce scénario qui affiche une liste simple dans mon affichage où je veux afficher le nom TaskStatus de la classe d'énumération au lieu de l'StatusId mais j'obtiens cette erreur "InvalidOperationException: Le type d'entité 'TaskStatus' requiert une clé primaire à définir."

Mon approche est-elle erronée?

<table clss="table"> 
    @foreach(var item in Model) 
    { 
     <tr> 
      <td>@item.Id</td> 
      <td>@item.Name</td> 
      <td>@item.Status</td> 
     </tr> 
    } 
</table> 

public class Tasks : BaseEntity 
{ 
    public string Name { get; set; } 
    public DateTime? StartDate { get; set; } 
    public DateTime? DueDate { get; set; } 
    public byte StatusId { get; set; } 
    public string AssignedTo { get; set; } 

    public virtual TaskStatus Status { get; set; } 
} 

public class IndexVm 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public DateTime? StartDate { get; set; } 
    public DateTime? DueDate { get; set; } 
    public byte StatusId { get; set; } 

    public TaskStatus Status { get; set; } 
} 

public class TaskStatus : Enumeration<TaskStatus, int> 
{ 
    public static readonly TaskStatus NotStarted   = new TaskStatus(1, "Not Started"); 
    public static readonly TaskStatus InProgress   = new TaskStatus(2, "In Progress"); 
    public static readonly TaskStatus Completed   = new TaskStatus(3, "Completed"); 
    public static readonly TaskStatus WaitingOnSomeoneElse = new TaskStatus(4, "Waiting on someone else"); 
    public static readonly TaskStatus Deferred    = new TaskStatus(5, "Deferred"); 

private TaskStatus(int value, string displayName) : base(value, displayName) { } 
} 

public class MappingProfile : Profile 
{ 
    public MappingProfile() 
    { 
     CreateMap<Tasks, IndexVm>() 
      .ForMember(vm => vm.Status, conf => conf.MapFrom(ol => ol.Status.DisplayName)); 
    } 
} 

Répondre

0

Votre problème n'a rien à voir avec Automapper. Le message d'erreur que vous obtenez provient de EntityFramework. Étant donné que vous définissez une propriété Status dans votre entité, EF tente de traiter la classe TaskStatus comme une autre entité, ce qui est impossible car elle ne possède pas de clé primaire comme l'indique le message d'erreur.

Si vous êtes mort mis sur l'utilisation des classes Enum un coup d'oeil here sous la rubrique « primitives encapsulées (alias le problème NodaTime/classe Enumeration) »

Essayez vous changer le code à quelque chose comme ceci:

public class IndexVm 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public DateTime? StartDate { get; set; } 
    public DateTime? DueDate { get; set; } 
    public byte StatusId { get; set; } 

    [NotMapped] 
    public TaskStatus Status { 
     get { //Return the value of StatusVal converted to an Enumeration 
     set { //Set the value of StatusVal after converting from an Enumeration } 
    } 
    public int StatusVal { get; set; } 
}