簡體   English   中英

如何在 Entity Framework Core 2.1 中播種枚舉

[英]How to seed an enum in Entity Framework Core 2.1

我是 EF Core 的新手,正在嘗試播種一個枚舉。

根據Data Seeding 的說法,此功能是 EF Core 2.1 的新增功能。

我回顧了幾個解決方案,包括Blake Mumford 的這個SO 解決方案,但這對我不起作用,因為枚舉不是引用類型。

我的目標(在遷移的幫助下)是將 Category 枚舉填充到名為 Category 的新 SQL 表中,並讓我的 Payment 表包含一個將 Category 表作為外鍵引用的列。

任何幫助將不勝感激。 謝謝。

public partial class Payment
{
    public int PaymentId { get; set; }
    public DateTime PostedDate { get; set; }
    public string Vendor { get; set; }
    public decimal Amount { get; set; }

    public virtual Category Category { get; set; }
}

public enum Category
{
    Restaurants,
    Groceries,
    [Display(Name = "Home Goods")]
    HomeGoods,
    Entertainment
}

public partial class MyDbContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // Error: The type Category must be a reference type in order to use it as parameter TEntity in the 
        // genric type or method ModelBuilder.Entity<TEntity>()

        modelBuilder.Entity<Category>().HasData(Category.Restaurants, 
                                                Category.Groceries, 
                                                Category.HomeGoods, 
                                                Category.Entertainment);
    }
}

這就是我所做的,希望它適用於您的環境。

環境

項目框架

  • .NetCore 3.0

掘金:

  1. EFCore 3.1.2
  2. EFCore.Design 3.1.2
  3. EFCore.Tools 3.1.2
  4. EFCore.Relational 3.1.2
  5. EFCore.SqlServer 3.1.2

執行

  1. 添加 OnModelCreating

     public partial class MyDbContext : DbContext { protected override void OnModelCreating(ModelBuilder modelBuilder) { // Error: The type Category must be a reference type in order to use it as parameter TEntity in the // genric type or method ModelBuilder.Entity<TEntity>() modelBuilder.Entity<UserRole>().HasData(EnumFunctions.GetModelsFromEnum<UserRole, UserRoleEnum>()); } }
  2. 創建通用枚舉函數

    public static class EnumFunctions { public static IEnumerable<TModel> GetModelsFromEnum<TModel, TEnum>() where TModel : IEnumModel<TModel, TEnum>, new() { var enums = new List<TModel>(); foreach (var enumVar in (TEnum[])Enum.GetValues(typeof(TEnum))) { enums.Add(new TModel { Id = enumVar, Name = enumVar.ToString() }); } return enums; } }
  3. 創建接口

    public interface IEnumModel<TModel, TModelIdType> { TModelIdType Id { get; set; } string Name { get; set; } }
  4. 將接口應用到模型

    [Table("UserRoles")] public class UserRole : IEnumModel<UserRole, UserRoleEnum> { [Key] public UserRoleEnum Id { get; set; } public string Name { get; set; } }
  5. 添加您的遷移

    PM> add-migration SeedUserRoleTable

您應該會看到添加的遷移

  1. 使用種子信息更新數據庫

    PM> update-database

您無法將枚舉類型的值播種到數據庫中,因為枚舉不是實體類型,因此不會首先進入數據庫。 換句話說,將沒有Categories表,因此將值播種到該不存在的表中是沒有意義的。

如果您實際上希望將類別保留在數據庫中,則需要創建一個類似以下的類:

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
}

在我的 Entities 文件夾下,我添加了 Enumerations 文件夾,我有這個:

public class UserStatus : Enumeration
    {

        public static readonly UserStatus New = new UserStatus(1, "New");
        public static readonly UserStatus UnderReview = new UserStatus(2, "UnderReview");
        public static readonly UserStatus Customer = new UserStatus(3, "Customer");
        public static readonly UserStatus Approved = new UserStatus(4, "Approved");
        public static readonly UserStatus Declined = new UserStatus(5, "Declined");

        public UserStatus(int id, string name)
                    : base(id, name)
        {
        }
    }

在我的 DataContext.cs 中,我只是用它來播種數據:

 modelBuilder.Entity<UserStatus>().HasData(Enumeration.GetAll<UserStatus>());

UserStatus 未在 DataContext.cs 中聲明為 DbSet

.NET 核心 3.1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM