【发布时间】:2017-06-12 11:37:12
【问题描述】:
我按照以下答案将枚举插入数据库;
How to create a table corresponding to enum in EF6 Code First?
但我面临一个奇怪的问题。每次我运行应用程序时,它都会额外输入最后一个枚举。例如,假设我有三个枚举选项; 开始,进行中,完成。 现在在第一次运行时,它按预期输入了 3 个值。
但在第二次运行时,数据库中有四行并且 Done 重复了。每次运行都会重复完成。
PS: 我对上面的文章做了一些修改。
我使用 DatabaseGenerated(DatabaseGeneratedOption.Identity) 而不是 DatabaseGenerated(DatabaseGeneratedOption.None)
我的表已经在数据库中了
我正在使用代码优先的方法,只是想重构代码。
我做错了什么还是有其他解决方案可以解决这个问题?
枚举类:
namespace ToDO.Data.Models
{
public class TaskStatus
{
private TaskStatusTaskStatusEnum @enum)
{
Id = (int)@enum;
Name = @enum.ToString();
Description = @enum.GetEnumDescription();
}
protected TaskStatus() { } //For EF
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required, MaxLength(100)]
public string Name { get; set; }
[MaxLength(100)]
public string Description { get; set; }
public static implicit operator TaskStatusTaskStatusEnum @enum) => new TaskStatus(@enum);
public static implicit operator TaskStatusEnumTaskStatus status) => (TaskStatusEnum)status.Id;
}
public enum TaskStatusEnum
{
[Description("Started")]
Started,
[Description("In Progress")]
InProgress,
[Description("Done")]
Done
}
}
在数据库中添加值的EF扩展方法:
public static void SeedEnumValues<T, TEnum>(this IDbSet<T> dbSet, Func<TEnum, T> converter)
where T : class => Enum.GetValues(typeof(TEnum))
.Cast<object>()
.Select(value => converter((TEnum)value))
.ToList()
.ForEach(instance => dbSet.AddOrUpdate(instance));
结果:
谢谢。
【问题讨论】:
标签: entity-framework enums ef-code-first code-first