我试图通过添加实体框架将持久性与我的身份服务器挂钩。当前,当尝试添加迁移时,我收到错误消息
未找到名为“ ConfigurationDbContext”的DbContext。
在运行迁移之前,我已经cd
进入了我的.csproj文件所在的目录,并且正在运行dotnet ef migrations add InitConfigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/Configuration
来尝试添加迁移。
我的Startup.cs
类如下:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
var migrationsAssembly = typeof(ApplicationDbContext).GetTypeInfo().Assembly.GetName().Name;
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddAspNetIdentity<ApplicationUser>()
.AddConfigurationStore(options =>
{
options.ConfigureDbContext = builder =>
builder.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
db => db.MigrationsAssembly(migrationsAssembly));
})
.AddOperationalStore(options =>
{
options.ConfigureDbContext = builder =>
builder.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
db => db.MigrationsAssembly(migrationsAssembly));
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseIdentityServer();
app.UseMvc();
}
}
如何解决此问题?
编辑:经过进一步调查,当我按如下方式生成迁移时使用--project
标志时:dotnet ef migrations add InitConfigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/Configuration --project BleacherBuddy.IdentityServerService
,我收到错误消息:
MSBUILD:错误MSB1009:项目文件不存在。无法 检索项目元数据。确保它是基于MSBuild的.NET Core 项目
我目前的猜测是,因为这是一个服务结构项目(无状态.net核心),所以构建过程在此处失败,并且不允许我生成迁移。经过一些研究,我仍然不确定如何克服这个问题,或者这是否是实际问题。我将简单的身份服务器项目重新创建为Web api(不使用服务结构),并且能够按预期生成类。感谢所有帮助。
答案 0 :(得分:1)
这就是我所做的。安装了以下软件包:
INSERT INTO @answerTable
SELECT T.*
from MainTable as T
WHERE
(@notes is null OR T.nkNotes LIKE '%' + @notes + '%') and
(
(T.fkTestType in (select TestType from @tempTestType) and T.fkLocation in (select fkLocation from @tempLocation))
or
((select count(1) where exists (select TestType from @tempTestType))=0 and T.fkLocation in (select fkLocation from @tempLocation))
or
(T.fkTestType in (select TestType from @tempTestType) and (select count(1) where exists (select fkLocation from @tempLocation))=0)
)
OPTION(RECOMPILE);
然后,我运行该项目并停止它,然后尝试使用
IdentityServer4
IdentityServer4.AspNetIdentity
IdentityServer4.EntityFramework
Microsoft.AspNetCore.Identity.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.SqlServer
命令成功了。
我猜测问题可能出在生成目标文件或完整的NuGet软件包还原上。
答案 1 :(得分:0)
dotnet ef migrations add InitConfigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/Configuration
在此命令中,您明确要求dotnet ef
使用ConfigurationDbContext
类作为数据库上下文。您的Startup.cs
中没有它,因此我假设您在其他地方有它。在这种情况下,您需要为工具提供完全限定的类名,包括名称空间,因此您的命令应如下所示:
dotnet ef migrations add InitConfigration -c Fully.Qualified.Namespaces.ConfigurationDbContext -o Data/Migrations/IdentityServer/Configuration
-将Fully.Qualified.Namespaces.
替换为您的ConfigurationDbContext
类的实际路径。
UPD:
或者,由于实际上使用ApplicationDbContext
作为EF存储设置了身份服务,因此您可能需要在命令中使用相同的上下文:
dotnet ef migrations add InitConfigration -c ApplicationDbContext -o Data/Migrations/IdentityServer/Configuration
在这种情况下,您可能还需要在上下文类名称之前指定完全限定的名称空间。
答案 2 :(得分:0)
此问题将在以下三种情况下发生:
即使将迁移都放在单独的类库中,因此在这种情况下,您也必须实现设计时接口并遵循Microsoft的说明。
或者您正在错误地J35
将此Nuget软件包安装到类库中。
您可能通过Visual Studio启用了docker-compose,这可能会导致与我在此处描述的问题相同的问题:Add-Migration while using database in separate Docker container throws an error
在所有情况下,请确保先清洁然后再构建解决方案,然后再次运行命令。
答案 3 :(得分:0)
这可能会有所帮助。这解决了我的问题,因为我在项目中使用了docker-compose。我不得不删除docker-compose并再次添加。
答案 4 :(得分:0)
添加后,我遇到了完全相同的问题
services.AddDbContext<IdentityDbContext>(o => { o.UseSqlServer(Configuration.GetConnectionString("IdentityConnection")); });
当我注释掉它时,它可以再次找到上下文。
答案 5 :(得分:0)
我正在使用 Identity Server 4。在code中进行了各种配置后,我访问了这个headline。
需要注意的点是从 Visual Studio 尝试不会有帮助。因此,最好在命令提示符下打开您的 IdentityServer 项目目录并先尝试以下命令
dotnet tool install --global dotnet-ef
dotnet add package Microsoft.EntityFrameworkCore.Design
然后尝试跟随
dotnet ef migrations add InitialIdentityServerPersistedGrantDbMigration -c PersistedGrantDbContext -o Migrations/IdentityServer/PersistedGrantDb
dotnet ef migrations add InitialIdentityServerConfigurationDbMigration -c ConfigurationDbContext -o Migrations/IdentityServer/ConfigurationDb
您的问题将得到解决。