Open tysongibby opened 1 year ago
@bricelam This is a deps.json case which is fully reproducible on my machine and doesn't go away after a full clean and rebuild. Also, the build outside of dotnet ef works fine. Any ideas?
I think this is failing because ThePlayer.Cleient is a wasm client project with no deps.json file and can not be executed by dotnet exec.
Maybe the SDK type could be detected and some actionable error message given, with a docs link.
@ErikEJ & @bricelam Thanks for looking at this. Is there a work-around I could be implementing or something different I can be doing for now?
@ErikEJ & @bricelam updated to 2.1.4, still having the same issue.
@tysongibby The workaround is to create a separate console application project in the solution. This project is used only to enable the EF tools to create an appropriate context instance. The project needs to reference the project containing your DbContext
and the EF Core database provider you are using. For example:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="6.0.12" />
<PackageReference Include="SQLitePCLRaw.core" Version="2.1.3" />
<PackageReference Include="SQLitePCLRaw.lib.e_sqlite3" Version="2.1.3" />
<PackageReference Include="SQLitePCLRaw.provider.e_sqlite3" Version="2.1.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ThePlayer\Shared\ThePlayer.Shared.csproj" />
</ItemGroup>
</Project>
The console application needs to have an IDesignTimeDbContextFactory
. Something like this:
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using ThePlayer.Shared.Data.Context;
Console.WriteLine("Hello, World!");
public class ContextFactory : IDesignTimeDbContextFactory<ThePlayerContext>
{
public ThePlayerContext CreateDbContext(string[] args)
=> new(null, new DbContextOptionsBuilder<ThePlayerContext>().UseSqlite(args[0]).Options);
}
This can then be used to generate migrations from the command line. For example:
PS C:\local\code\repros\ThePlayer-master\ThePlayer-master\ConsoleApp1> dotnet ef migrations add One --project ..\ThePlayer\Shared\ThePlayer.Shared.csproj -- "DataSource=ThePlayer.db"
Build started...
Build succeeded.
Done. To undo this action, use 'ef migrations remove'
PS C:\local\code\repros\ThePlayer-master\ThePlayer-master\ConsoleApp1>
@ajcvickers Docs enhancement?
Thanks, I'll implement that tonight after work.
@ajcvickers Thanks for the work-around.
When I set things up the way you suggest I am getting the error Exception has been thrown by the target of an invocation.
This is the output from my migration:
PM> add-migration initial
Build started...
Build succeeded.
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
---> System.IndexOutOfRangeException: Index was outside the bounds of the array.
at ContextFactory.CreateDbContext(String[] args) in C:\git\ThePlayer\SqlLiteEf\Program.cs:line 12
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle.InvokeMethod(Object target, Span`1& arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContextFromFactory(Type factory, Type contextType)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.<>c__DisplayClass21_2.<FindContextTypes>b__9()
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func`1 factory)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType)
at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType, String namespace)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType, String namespace)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.<>c__DisplayClass0_0.<.ctor>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
Exception has been thrown by the target of an invocation.
@tysongibby In my example I set it up to take the connection string from the command line. Looks like you are not passing it. The connection string doesn't have to come from the command line, but then you shouldn't be trying to get it out of args.
@ajcvickers Thanks for your help and your patience. I am obviously doing something wrong implementing the work-around. I am getting an error where it can't find the dbcontext:
dotnet ef migrations add One --project ..\ThePlayer\ThePlayer\Shared\ThePlayer.Shared.csproj -- "DataSource=ThePlayer.db"
Build started...
Build succeeded.
The Entity Framework tools version '6.0.12' is older than that of the runtime '6.0.13'. Update the tools for the latest features and bug fixes. See https://aka.ms/AAc1fbw for more information.
System.InvalidOperationException: No database provider has been configured for this DbContext. A provider can be configured by overriding the 'DbContext.OnConfiguring' method or by using 'AddDbContext' on the application service provider. If 'AddDbContext' is used, then also ensure that your DbContext type accepts a DbContextOptions<TContext> object in its constructor and passes it to the base constructor for DbContext.
at Microsoft.EntityFrameworkCore.Internal.DbContextServices.Initialize(IServiceProvider scopedProvider, DbContextOptions contextOptions, DbContext context)
at Microsoft.EntityFrameworkCore.DbContext.get_ContextServices()
at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()
at Microsoft.EntityFrameworkCore.DbContext.Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure<System.IServiceProvider>.get_Instance()
at Microsoft.EntityFrameworkCore.Infrastructure.Internal.InfrastructureExtensions.GetService[TService](IInfrastructure`1 accessor)
at Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService[TService](IInfrastructure`1 accessor)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func`1 factory)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType)
at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType, String namespace)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType, String namespace)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.<>c__DisplayClass0_0.<.ctor>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
No database provider has been configured for this DbContext. A provider can be configured by overriding the 'DbContext.OnConfiguring' method or by using 'AddDbContext' on the application service provider. If 'AddDbContext' is used, then also ensure that your DbContext type accepts a DbContextOptions<TContext> object in its constructor and passes it to the base constructor for DbContext.
updated the code in the repo: https://github.com/tysongibby/ThePlayer
@ajcvickers Thanks for your help and your patience. I am obviously doing something wrong implementing the work-around. I am getting an error where it can't find the dbcontext:
dotnet ef migrations add One --project ..\ThePlayer\ThePlayer\Shared\ThePlayer.Shared.csproj -- "DataSource=ThePlayer.db" Build started... Build succeeded. The Entity Framework tools version '6.0.12' is older than that of the runtime '6.0.13'. Update the tools for the latest features and bug fixes. See https://aka.ms/AAc1fbw for more information. System.InvalidOperationException: No database provider has been configured for this DbContext. A provider can be configured by overriding the 'DbContext.OnConfiguring' method or by using 'AddDbContext' on the application service provider. If 'AddDbContext' is used, then also ensure that your DbContext type accepts a DbContextOptions<TContext> object in its constructor and passes it to the base constructor for DbContext. at Microsoft.EntityFrameworkCore.Internal.DbContextServices.Initialize(IServiceProvider scopedProvider, DbContextOptions contextOptions, DbContext context) at Microsoft.EntityFrameworkCore.DbContext.get_ContextServices() at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider() at Microsoft.EntityFrameworkCore.DbContext.Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure<System.IServiceProvider>.get_Instance() at Microsoft.EntityFrameworkCore.Infrastructure.Internal.InfrastructureExtensions.GetService[TService](IInfrastructure`1 accessor) at Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService[TService](IInfrastructure`1 accessor) at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func`1 factory) at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType) at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType, String namespace) at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType, String namespace) at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.<>c__DisplayClass0_0.<.ctor>b__0() at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0() at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action) No database provider has been configured for this DbContext. A provider can be configured by overriding the 'DbContext.OnConfiguring' method or by using 'AddDbContext' on the application service provider. If 'AddDbContext' is used, then also ensure that your DbContext type accepts a DbContextOptions<TContext> object in its constructor and passes it to the base constructor for DbContext.
updated the code in the repo: https://github.com/tysongibby/ThePlayer
did you had any luck with the workaround? im trying to build a .net maui blazor app with ef and sqlite and having problems with adding my first migration
Thank you for looking at this issue.
I have not yet been able to get this project to successfully create the first SQLite database migration. Link to the repo for my full code
Eric Sink on the SQLitePCL.raw project thought this may be an issue related to EfCore.
I am receiving the error "The specified deps.json [C:\git\ThePlayer\ThePlayer\Client\bin\Debug\net6.0\ThePlayer.Client.deps.json] does not exist" when I run the database migration command "add-migration initial"
I am using the following: SQLitePCLRaw version 2.1.3 nuget package: SQLitePCLRaw.bundle_e_sqlite3 Microsoft.EntityFrameworkCore.Sqlite.Core version 6.0.12
Visual Studio 2022 17.43, .NET 6 Blazor WASM, Windows 11 Pro 22H2 22621.963, Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz 2.59 GHz
Target framework:
.NET 6, Blazor WASM, client browser
These are the packages currently referenced in my project:
output from rebuild: