我已经跟踪MSDN如何处理EF6的Code First中的枚举.它起作用,但是在创建的表中引用枚举器的字段是一个简单的int.
我更喜欢生成第二个表,其值将遵循C#代码中枚举数的定义.因此,我不想仅在MSDN上的示例中获取与Department对应的表,而是还希望看到由Faculty中的项填充的第二个表.
public enum Faculty { Eng, Math, Eco }
public partial class Department
{
[Key] public Guid ID { get; set; }
[Required] public Faculty Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在研究这个问题时,我偶然发现了一个解决方案,它建议为枚举创建一个表并通过种子显式填充它.
在我看来,这是一种繁琐的方法和许多应该自动处理的工作.毕竟,系统知道构成枚举的实际值.从数据库的角度来看,它仍然是数据行,就像我创建的实体一样,但从OO方面来说,它实际上并不是一个数据 - 而是一种类型(松散表达),它可以假设一个有限的和预先知道的状态数.
是否建议"手动"填充表格的方法?
似乎在Entity Framework 7中还没有对种子数据的原生支持(https://github.com/aspnet/EntityFramework/issues/629).
Microsoft提供的模板代码中没有DbMigrationsConfiguration类,没有Seed方法.
那么如何在使用Entity Framework 7 RC 1的ASP.NET MVC 6 Web应用程序中播种数据呢?
c# entity-framework seeding entity-framework-core asp.net-core-mvc
我已经在SO上看到了一些关于这方面的类似例子,但是我还不太了解该语言,看看我做错了什么.我拼凑了一个演示来了解更多,但我在播种数据库时遇到了麻烦.
我收到以下错误:
InvalidOperationException:无法从根提供程序解析作用域服务"demoApp.Models.AppDbContext".
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(类型serviceType,ServiceProvider serviceProvider)
以下是有问题的三个文件:
型号/ AppDbContext.cs
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
{
}
public DbSet<Product> Products{ get; set; }
public DbSet<Category> Categories { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
型号/ DBInitializer.cs
public static class DbInitializer
{
public static void Seed(IApplicationBuilder applicationBuilder)
{
//I'm bombing here
AppDbContext context = applicationBuilder.ApplicationServices.GetRequiredService<AppDbContext>();
if (!context.Products.Any())
{
// Add range of products
}
context.SaveChanges();
}
private static Dictionary<string, Category> _categories;
public static Dictionary<string, Category> Categories
{
get
{
if …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 ASP.NET CORE 3.0 和 EF Core 为数据库设置一些数据。
我已经创建了我的 DbContext 并根据文档、在线资源,甚至EF Core 2.1 问题(我找不到关于这个主题的任何重大更改)。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Band>().HasData(
new Band()
{
Id = Guid.Parse("e96bf6d6-3c62-41a9-8ecf-1bd23af931c9"),
Name = "SomeName",
CreatedOn = new DateTime(1980, 2, 13),
Description = "SomeDescription"
});
base.OnModelCreating(modelBuilder);
}
Run Code Online (Sandbox Code Playgroud)
这不符合我的预期:启动应用程序时没有任何种子(即使在调试期间从某处调用该方法)。
但是,如果我添加迁移,迁移包含相应的插入语句(这不是我正在寻找的种子类型)。
问题:在应用程序启动时执行数据库种子的正确方法是什么?
通过为数据库设置种子,我的意思是我希望每次启动应用程序时都可以在某些表中确保某些数据。
我可以选择创建种子类并在使用自定义代码的 Database.Migrate 之后处理它,但这似乎是一种解决方法,因为文档指定应使用 OnModelCreating 来种子数据)。
因此,在阅读答案并重新阅读文档后,我的理解是,“种子”是指可以在数据模型旁边进行的“初始化”(这就是为什么感觉很奇怪 - 将模型创建与数据播种部分)。
我想在迁移时将数据插入表中。是否可以?迁移需要可用的无参数构造函数,我想使用 Startup.cs 文件中定义的 db 上下文(最好我想通过依赖注入获得它)。那怎么办?
我是 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 …Run Code Online (Sandbox Code Playgroud) asp.net entity-framework entity-framework-core .net-core asp.net-core
我有一个迁移课程:
public partial class TestMigration : Migration
{
protected override void Up(MigrationBuilder db)
{
Run Code Online (Sandbox Code Playgroud)
在Up方法的最后,我想添加一些数据(种子)。MigrationBuilder公开了一些方法,还有Sql(),但是我想使用EF。
我可以在这里注入DbContext并做一些事情吗?