2017-01-26 19 views
0

Я выполнил следующий ответ, чтобы вставить перечисления в базу данных;Создать таблицу, соответствующую enum Entity framework

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

Но я столкнулся один странный вопрос. Каждый раз, когда я запускаю приложение, он также вводит последнее перечисление. Например, предположим, что у меня есть три варианта перечисления; Начато, Выполняется, Выполнено. теперь в первом запуске он вводит 3 значения, как ожидалось.

, но при втором запуске в базе данных четыре строки и Done дублируется. Выполняется дублирование при каждом прогоне.

PS: Я сделал некоторые изменения из выше статьи.

  1. Я использовал DatabaseGenerated (DatabaseGeneratedOption.Identity) вместо DatabaseGenerated (DatabaseGeneratedOption.None)

  2. Моя таблица уже есть в базе данных

  3. Я использую код-первый подход и просто хотел пересчет кода.

Я делаю что-то неправильно или есть какое-либо другое решение для решения этой проблемы?

Enum Класс:

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

AddOrUpdate делает сравнение с основным ключом. Перечисления начинаются с 0. Этого нет в базе данных, поэтому он добавляется снова. Вы можете использовать AddOrUpdate (x => x.Code .. и т. Д.