为了账号安全,请及时绑定邮箱和手机立即绑定

.Net Core 2.1 似乎忽略了 modelBuilder.Entity.Entity

.Net Core 2.1 似乎忽略了 modelBuilder.Entity.Entity

C#
jeck猫 2022-08-20 14:44:38
我有一个.net核心项目,其中包含模型,服务和api项目。我这个项目的最初目标是让枚举以一种更“代码优先”的方式工作。我希望能够修改枚举并相应地更新数据库和查找表。在花了太多时间试图弄清楚如何做到这一点之后,我决定创建一个特殊的枚举类,并使用“HasData”手动设定种子。我以前做过这个,没有遇到过问题。我做的最后一个项目是.Net Core 2.1。此项目使用的是 2.2。我无法判断我是否发现了一个奇怪的错误,或者我是否只是做错了什么。我的“服务”项目是DbContext所在的位置,大多数相关代码都在。我有一个模型,看起来像:public class Employee : IEmployee{    [Key]    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]    [Display(Name = "Id")]    public int Id { get; set; }    [StringLength(512, ErrorMessage = "The first name cannot be longer than 512 characters")]    [Display(Name = "First Name")]    [Required]    public string FirstName { get; set; }    [StringLength(512, ErrorMessage = "The last name cannot be longer than 512 characters")]    [Display(Name = "Last Name")]    [Required]    public string LastName { get; set; }    public Department Department { get; set; }}它有一个枚举:public enum Department{    [Description("Sales")]    Sales = 1,    [Description("Customer Service")]    CustomerService = 2,    [Description("Technical Support")]    TechnicalSupport = 3}我创建了一个与枚举相对应的模型,如下所示:[Table("Department")]public class DepartmentEnum : EnumBase<Department>{    public DepartmentEnum()    {    }}它有一个基类,如下所示:public class EnumBase<TEnum> where TEnum : struct{    [Key]    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]    public virtual int Id { get; set; }    [Required]    [MaxLength(100)]    public virtual string Name { get; set; }    [MaxLength(100)]    public virtual string Description { get; set; }    public virtual bool Deleted { get; set; } = false;}在本节中,我将播种我想要在此表中的数据。由于服务项目无法直接启动,也无法了解它的连接字符串,因此我创建了一个从它继承的字符串,如下所示:无论我做什么,创造的“HasData”药水永远不会存在。我尝试将db上下文切换到普通的。我尝试通过首先添加员工表,然后返回并添加部门表作为第二次迁移来更改事件的顺序。似乎我所做的任何事情都不会让迁移包含种子数据。DbContext任何人都可以发现我的问题吗?
查看完整描述

1 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

您应该注意编译器警告。

这里

protected internal virtual void OnModelCreating(ModelBuilder modelBuilder)

您正在隐藏基方法(必须有一个编译器警告告诉它)。当然,EF Core 基础结构不是调用你的方法,而是调用类中定义的方法。OnModelCreatingDbContext

因此,无论你放在那里什么都没有效果 - 表是基于EF Core约定创建的,当然也没有数据种子。Department

将方法签名更改为

protected override void OnModelCreating(ModelBuilder modelBuilder)

并确保致电

base.OnModelCreating(modelBuilder);

在最开始。当您继承(或除 不执行任何操作之外的任何基上下文类)时,这一点尤其重要。IdentityContextDbContext


查看完整回答
反对 回复 2022-08-20
  • 1 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信