Reputation: 6262
I'm facing an error while trying to obtain information of the DbSets in a DbContext object by using Entity Framework core.
My DbContext object looks this way:
public class CatalogueContext : DbContext
{
public DbSet<ConnectorCatalogueItemConv> CatalogueItemConvs { get; set; }
public CatalogueContext(DbContextOptions<CatalogueContext> options)
: base(options)
{
}
public CatalogueContext()
{
}
}
I'm trying to instante the context by calling a method which receives a generic type T which might be childs of DbContext this way:
public T GetContext<T>() where T: DbContext, new()
{
var optionsBuilder = new DbContextOptionsBuilder<T>();
var connectionString = Configuration.GetConnectionString(ExternalTablesKey);
optionsBuilder.UseSqlServer(connectionString);
return Activator.CreateInstance(typeof(T), optionsBuilder.Options) as T;
}
The connection string is obtained properly by using Microsoft.Extensions.Configuration so the problem it's not there.
Finally, I invoke this method and try to obtain any record on the DbSets declared as follows:
public void SomeMethod()
{
using (var db = this.GetContext<CatalogueContext>())
{
var val = db.CatalogueItemConvs.ToList(); //Here is where I get the error below.
}
}
The error shown says:
Method 'ProcessModelFinalized' in type 'Microsoft.EntityFrameworkCore.Metadata.Conventions.SqlServerValueGenerationStrategyConvention' from assembly 'Microsoft.EntityFrameworkCore.SqlServer, Version=3.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' does not have an implementation.'
I searched everywhere, but seems to be that there's very few information about this error. Any thoughts?
EDIT 1: My solution includes Microsoft.EntityFrameworkCore.SqlServer in version 3.0.0.0
EDIT 2: As requested, I have edited the code to include only one entity and its class declaration. There's no mapping at this point.
public class ConnectorCatalogueItemConv
{
public string CodConnector { get; set; }
public string CodCatalogue { get; set; }
public string CodItemCia { get; set; }
public string CodItemInbk { get; set; }
public bool Defaultvalue { get; set; }
}
EDIT 3: How to instantiate a DbContext in EF Core
Upvotes: 7
Views: 8722
Reputation: 199
My two cents: If you wish to use the .NET core 3.0 version instead of upgrading to the .Net 5.0, then all you need to do is make sure that all the packages mentioned above use the version 3.x.x instead of the 5.x.x. I noticed that when you try to scaffold identity pages, it installs the 5.x.x version of the package since its the latest, instead of checking the package .net core version and installing the appropriate version.
Upvotes: 5
Reputation: 453
I was using Microsoft.EntityFrameworkCore.InMemory v3.1.10 with Xunit v2.4.1 for testing and had the following error pop up while seeding a context:
System.TypeLoadException: 'Method 'CommitTransactionAsync' in type 'Microsoft.EntityFrameworkCore.InMemory.Storage.Internal.InMemoryTransactionManager' from assembly 'Microsoft.EntityFrameworkCore.InMemory, Version=3.1.10.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' does not have an implementation.'
Updating all my Microsoft.EntityFrameworkCore packages to v5.0.0 cleared up the issue.
Upvotes: 0
Reputation: 1180
If you have same issue but in testing project and your are using Microsoft.EntityFrameworkCore.InMemory you fix this error by installing version v3.1.10
Upvotes: 0
Reputation: 316
I have also faced the same error, I have update my Microsoft.EntityFrameworkCore.SqlServer and Microsoft.EntityFrameworkCore.Tools to Version 5.0 and then it worked,
Upvotes: 17