我按照以下答案将枚举插入数据库;
How to create a table corresponding to enum in EF6 Code First?
但我面临一个奇怪的问题。每次我运行应用程序时,它还会输入最后一个枚举。例如,假设我有三个enum选项; 开始,进行中,完成。 现在在第一次运行时,它按预期输入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 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));
结果:
感谢。
答案 0 :(得分:1)
AddOrUpdate
与主键进行比较。枚举从0开始。这个不在数据库中,因此再次添加。您可以使用AddOrUpdate(x =&gt; x.Code .. etc