创建一个 table 对应于 enum Entity framework
Create a table corresponding to enum Entity framework
我按照以下答案将枚举插入数据库;
但是我遇到了一个奇怪的问题。每次我 运行 应用程序,它都会额外输入最后一个枚举。例如,假设我有三个枚举选项;
开始,进行中,完成。
现在首先 运行,它按预期输入 3 个值。
但是在第二个 运行 上,数据库中有四行并且 Done 是重复的。在每个 运行.
上重复完成
PS:
我对上面的文章做了一些修改。
我使用了 DatabaseGenerated(DatabaseGeneratedOption.Identity) 而不是 DatabaseGenerated(DatabaseGeneratedOption.None)
我的table已经在数据库中
我正在使用代码优先方法,只是想重构代码。
我是不是做错了什么或者有其他解决方案吗?
枚举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
我按照以下答案将枚举插入数据库;
但是我遇到了一个奇怪的问题。每次我 运行 应用程序,它都会额外输入最后一个枚举。例如,假设我有三个枚举选项; 开始,进行中,完成。 现在首先 运行,它按预期输入 3 个值。
但是在第二个 运行 上,数据库中有四行并且 Done 是重复的。在每个 运行.
上重复完成PS: 我对上面的文章做了一些修改。
我使用了 DatabaseGenerated(DatabaseGeneratedOption.Identity) 而不是 DatabaseGenerated(DatabaseGeneratedOption.None)
我的table已经在数据库中
我正在使用代码优先方法,只是想重构代码。
我是不是做错了什么或者有其他解决方案吗?
枚举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