C# 模型创建方法中EF核心的依赖项注入
我想在C# 模型创建方法中EF核心的依赖项注入,c#,dependency-injection,.net-core,ef-core-2.2,C#,Dependency Injection,.net Core,Ef Core 2.2,我想在DbContext的OnModelCreating方法中调用我自己的一些服务。我需要做什么 我可以通过DbContext构造函数注入服务。但它似乎不够有效,因为该方法在应用程序启动时被调用一次,因此我必须充实我的整个DbContext类 public PortalContext(DbContextOptions<PortalContext> options, IPasswordService passwordService) : base(options) { this
DbContext
的OnModelCreating
方法中调用我自己的一些服务。我需要做什么
我可以通过DbContext
构造函数注入服务。但它似乎不够有效,因为该方法在应用程序启动时被调用一次,因此我必须充实我的整个DbContext类
public PortalContext(DbContextOptions<PortalContext> options, IPasswordService passwordService) : base(options)
{
this._passwordService = passwordService;
}
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
...
entity<User>().HasData(
new User
{
UserName = "admin",
Password = this._passwordService.EncryptPassword("passw0rd");
}
);
...
}
公共PortalContext(DbContextOptions选项,IPasswordService密码服务):基本(选项)
{
这._passwordService=passwordService;
}
...
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
...
实体().HasData(
新用户
{
UserName=“admin”,
Password=this.\u passwordService.EncryptPassword(“passw0rd”);
}
);
...
}
能否用以下代码替换上述代码:
public PortalContext(DbContextOptions<PortalContext> options) : base(options)
{
}
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
...
var passwordService = GetPasswordService(); // How?
entity<User>().HasData(
new User
{
UserName = "admin",
Password = passwordService.EncryptPassword("passw0rd");
}
);
...
}
公共PortalContext(DbContextOptions选项):基本(选项)
{
}
...
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
...
var passwordService=GetPasswordService();//如何操作?
实体().HasData(
新用户
{
UserName=“admin”,
Password=passwordService.EncryptPassword(“passw0rd”);
}
);
...
}
使用
this.Database.GetService();
它是一种扩展方法,位于Microsoft.EntityFrameworkCore.Infrastructure的命名空间中
this.Database.GetService();
它是一个扩展方法,位于Microsoft.EntityFrameworkCore.Infrastructure命名空间(不确定)试试这个。Database.GetService()没有这样的方法。它是一个扩展方法,位于Microsoft.EntityFrameworkCore.Infrastructure命名空间中。是的。它起作用了。谢谢@artur。(不确定)试试这个。Database.GetService()没有这样的方法。它是一个扩展方法,位于Microsoft.EntityFrameworkCore.Infrastructure namespace.Yes中。它起作用了。谢谢@artur@Khodaie,您是否已经尝试使用此代码段创建迁移?我认为它会引发异常,因为当ef工具创建
PortalContext
的实例时,您的服务提供商没有注册IPasswordService
。您应该在IDesignTimeDbContextFactory
类中注册此服务。@Khodaie,您已经尝试使用此代码段创建迁移了吗?我认为它会引发异常,因为当ef工具创建PortalContext
实例时,您的服务提供商没有注册IPasswordService
。您应该在IDesignTimeDbContextFactory
类中注册此服务。
this.Database.GetService<IPasswordService>();