创建一个 table 对应于 enum Entity framework

Create a table corresponding to enum Entity framework

我按照以下答案将枚举插入数据库;

但是我遇到了一个奇怪的问题。每次我 运行 应用程序,它都会额外输入最后一个枚举。例如,假设我有三个枚举选项; 开始,进行中,完成。 现在首先 运行,它按预期输入 3 个值。

但是在第二个 运行 上,数据库中有四行并且 Done 是重复的。在每个 运行.

上重复完成

PS: 我对上面的文章做了一些修改。

  1. 我使用了 DatabaseGenerated(DatabaseGeneratedOption.Identity) 而不是 DatabaseGenerated(DatabaseGeneratedOption.None)

  2. 我的table已经在数据库中

  3. 我正在使用代码优先方法,只是想重构代码。

我是不是做错了什么或者有其他解决方案吗?

枚举Class:

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));

结果:

Database result

谢谢。

AddOrUpdate 与主键进行比较。 Enums是从0开始的,这个在数据库中没有所以重新添加。您可以使用 AddOrUpdate(x=>x.Code.. etc