创建与枚举实体框架对应的表

时间:2017-01-26 21:03:26

标签: entity-framework enums ef-code-first code-first

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

How to create a table corresponding to enum in EF6 Code First?

但我面临一个奇怪的问题。每次我运行应用程序时,它还会输入最后一个枚举。例如,假设我有三个enum选项; 开始,进行中,完成。 现在在第一次运行时,它按预期输入3个值。

但是第二次运行时,数据库中有四行,Done重复。每次运行都会重复完成。

PS: 我从上面的文章中做了一些改动。

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

  2. 我的桌子已经在数据库中

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

  4. 我做错了什么或有其他解决方案可以解决这个问题吗?

    枚举类:

    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 Extenstion方法:

    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

    感谢。

1 个答案:

答案 0 :(得分:1)

AddOrUpdate与主键进行比较。枚举从0开始。这个不在数据库中,因此再次添加。您可以使用AddOrUpdate(x =&gt; x.Code .. etc