自动映射枚举 Class
AutoMapping Enumeration Class
我正在尝试使用枚举 classes (link) 而不是枚举和 "lookup tables".
我有这种情况,它在我的视图中显示一个简单的列表,我想在其中显示枚举 class 中的 TaskStatus 名称而不是 StatusId,但我收到此错误 "InvalidOperationException: The entity type 'TaskStatus' requires a primary key to be defined."
难道我的做法全错了吗?
<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));
}
}
您的问题与Automapper无关。您收到的错误消息来自 EntityFramework。因为您在实体中定义了 Status
属性,所以 EF 试图将 TaskStatus
class 视为另一个实体,但它不能,因为它没有主键作为错误消息状态。
如果您对使用 Enum 死心塌地 class请看一下标题 "Encapsulated primitives (aka the NodaTime/Enumeration class problem)"
下的 here
尝试将您的代码更改为如下内容:
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; }
}
我正在尝试使用枚举 classes (link) 而不是枚举和 "lookup tables".
我有这种情况,它在我的视图中显示一个简单的列表,我想在其中显示枚举 class 中的 TaskStatus 名称而不是 StatusId,但我收到此错误 "InvalidOperationException: The entity type 'TaskStatus' requires a primary key to be defined."
难道我的做法全错了吗?
<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));
}
}
您的问题与Automapper无关。您收到的错误消息来自 EntityFramework。因为您在实体中定义了 Status
属性,所以 EF 试图将 TaskStatus
class 视为另一个实体,但它不能,因为它没有主键作为错误消息状态。
如果您对使用 Enum 死心塌地 class请看一下标题 "Encapsulated primitives (aka the NodaTime/Enumeration class problem)"
下的 here尝试将您的代码更改为如下内容:
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; }
}