EF6 with Npgsql under Asp.net 5 - postgresql

Hi I am trying to use EF6 with npsql under Asp.net 5. I am using a simple console (asp.net5) for testing and a separate class lib (.net 4.5) for the data access as a simple test enviroment. Have installed EF6 using
nuget EntityFramework6.Npgsql. Have also removed .net core dependencies from project.json file.
The problem i keep on getting the following error.
An exception of type 'System.NotSupportedException' occurred in EntityFramework.dll but was not handled in user code
Additional information: Unable to determine the provider name for provider factory of type 'Npgsql.NpgsqlFactory'. Make sure that the ADO.NET provider is installed or registered in the application config.
It seems to have trouble with the provider name for 'Npgsql.NpgsqlFactory'. But the provider name in the configuration is set. May be it needs to be set when it was compiled. Any ideas?
the app.config file is as follows
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<entityFramework>
<providers>
<provider invariantName="Npgsql.NpgsqlFactory" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework"></provider>
</providers>
<defaultConnectionFactory type="Npgsql.NpgsqlConnectionFactory, Npgsql" />
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="Npgsql" />
<add name="Npgsql" invariant="Npgsql" description=".Net Framework Data Provider for Postgresql" type="Npgsql.NpgsqlFactory, Npgsql" />
</DbProviderFactories>
</system.data>
</configuration>
Any help will be much appreciated. Many thanks.

You are missing the complete assembly information for npgsql in your configuration. Please, check this answer for more information about it and the complete information:
https://stackoverflow.com/a/35440114/246097
I hope it helps.

Related

Entity Framework looks for ADO.NET provider SqlServerCe.3.5 instead of 4.0

I am using SQL Server CE 4.0 along with entity framework 6.0. Everythings work fine until I wanted to enable a N-Tier syncing mechanism with a remote database using a WCF service and the Sync Framework 2.1.
I followed this tutorial and use the JTune's workaround to overcome the issue that the SyncFramework 2.1 and SQLSErverCompactCE 4.0 compatibility is not supported. Which is simply a runtime binding redirect in app.config for System.Data.SqlServerCE.dll 4.0.0
Then I get the following App.config file
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
<parameters>
<parameter value="System.Data.SqlServerCe.4.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
</providers>
</entityFramework>
<connectionStrings>
<add name="Entities" connectionString="metadata=res://*/Persistence.Model1.csdl|res://*/Persistence.Model1.ssdl|res://*/Persistence.Model1.msl;provider=System.Data.SqlServerCe.4.0;provider connection string="data source=|DataDirectory|\XXXX.sdf"" providerName="System.Data.EntityClient" />
</connectionStrings>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845DCD8080CC91" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SqlServerCe.4.0" />
<add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</DbProviderFactories>
</system.data>
</configuration>
It works fine on some configuration but may fail with the following error.
No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlServerCe.3.5'. Make sure the provider is registered in the 'entityFramework' section of the application config file. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.
Remark that the solution provided in this question is not viable, because in my situation, I really need the binding redirect to use SyncFramework.
Is there a way to tell entity framework not to look for a SQL Server CE 3.5 provider and only for the 4.0?
I think I got this. When SQL Server CE 3.5 is installed on the machine then its added to the DbProviders in the machine.config and depending on its position regarding the 4.0 version you may have the failure (see my comment above). It looks like the app.config lets you the possibility to remove a DbProviderFactory. I added the following line in my app.config and the problem seems to be resolved
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SqlServerCe.3.5" />
</DbProviderFactories>
</system.data>

EF Code First (Azure) - An error occurred accessing the database

Until recently my solution only had 1 web project. It is deployed to Azure.
There then became a requirement for WebJobs, which should share the data layer, so I extracted out any EntityFramework code (Configuration/IdentityModels) into their own project.
Now when I try to use the command line to "add-migration" I get the following error:
An error occurred accessing the database. This usually means that the
connection to the database failed. Check that the connection string is
correct and that the appropriate DbContext constructor is being used
to specify it or find it in the application's config file. See
http://go.microsoft.com/fwlink/?LinkId=386386 for information on
DbContext and connections. See the inner exception for details of the
failure.
Here is what the App.Config file looks like for the EF project:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
<connectionStrings>
<add name="Default" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Sample;Integrated Security=True;Connect timeout=15;Encrypt=False;TrustServerCertificate=False" providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
Can anyone help please?
I just had the same problem.
It seems there is a required order of configuration child elements.
In my case I changed them to:
<configSections>...</configSections>
<startup>...</startup>
<system.data>...</system.data>
<connectionStrings>...</connectionStrings>
<entityFramework>...</entityFramework>

how to use EF6 with SQLite?

I have a project, I use nuget to install SQLite 1.0.93.0. This install EF6 and add the references to the project. Also update my app.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite" />
<!--<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />-->
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".Net Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
</DbProviderFactories>
</system.data>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
</entityFramework>
</configuration>
Then I create a new connection to my sqlite database and I try to create an edmx, but I get an error that says that my project has a reference to the newest version of EF but there is no a compatible provider for this connection to the database. If I have a a compatible provider I have to recompile the project, or if I have not a compatible provider I have to install it and recompile the project.
I try to recompile the project but the problem persists. I don't know how to install a compatible provider.
If in the references of the project I delete the references to EntityFramework.dll and EntityFramework.SQLserver.dll then in the wizard to create the edmx a have the option to choose between EF6.x and EF5. only have enabled the option to select EF5, so in this case I use EF5 and not EF6.
How can I use EF6 with SQLite?
Thanks.
Please see if my answer here works for you (be sure to watch the video) : Database first create entity framework 6.1.1 model using system.data.sqlite 1.0.93

Unable to find the requested .Net Framework Data Provider. It may not be installed

This morning I suddenly got this exception when trying to add a custom migration step to our EF Code-first migrations:
The ADO.NET provider with invariant name '.NET Framework Data Provider for SQL Server' is either not registered in the machine or application config file, or could not be loaded.
I have no problem executing a update-database against our SQL Server but the add-migration command fails.
We are using.Net 4.5.1 with EF Code First 6.0.1 against SQL Server 2012.
Our configuration file for our data project is this:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
<parameters>
<parameter value="System.Data.SqlClient" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
<connectionStrings>
<add name="Data.StorageContext" connectionString="server=.\MSSQL01;Database=OutageTracking; Integrated Security=True; MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
</configuration>
Note that Visual Studio 2012 complains about the -element in the -section.
Any thoughts?
Thanks,
/Jesper
".NET Framework Data Provider for SQL Server" is not an invariant name, so some .config file somewhere must be in a bad state

Postgresql, Entity Framework and Mono 3

I'm trying to get EF to work with Postgresql on a Linux platform. When I try to connect to the database I end up with this error: Failed to find or load the registered .Net Framework Data Provider 'Npgsql Data Provider'. My app.config file:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework"
type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework" />
</configSections>
<system.data>
<DbProviderFactories>
<remove invariant="Npgsql"></remove>
<add name="Npgsql Data Provider"
invariant="Npgsql"
description=".Net Framework Data Provider for Postgresql Server"
type="Npgsql.NpgsqlFactory, Npgsql, Version=4.0.0.0, Culture=neutral" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<add name="MinDatabase" connectionString="Server=localhost;Port=5432;Database=postgres;User Id=postgres;Password=;CommandTimeout=20;"
providerName="Npgsql Data Provider" />
</connectionStrings>
</configuration>
How can I make Mono load the data provider?
The error message contains the invariant name, so its looking for something with invariant name "Npgsql Data Provider" and you specifically set the invariantName to Npgsql. So maybe try to change to use the same name all over your configuration like this:
<system.data>
<DbProviderFactories>
<remove invariant="Npgsql"></remove>
<add name="Npgsql"
invariant="Npgsql"
description=".Net Framework Data Provider for Postgresql Server"
type="Npgsql.NpgsqlFactory, Npgsql, Version=4.0.0.0, Culture=neutral" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<add name="MinDatabase" connectionString="Server=localhost;Port=5432;Database=postgres;User Id=postgres;Password=;CommandTimeout=20;"
providerName="Npgsql" />
</connectionStrings>
Hope it works
Where did you download Npgsql from? If you are using Npgsql from official releases, your problem is the Version attribute of the assembly. Npgsql which supports EF 4.x has version 2.0.14.3 and Npgsql which supports EF 6 has version 2.1.0. None has version 4.0.0.0.
For more info about using Npgsql with Entity Framework, check out:
How to integrate PostgreSql with EntityFramework 6.0.2?
Entity Framework 6 with Npgsql
http://fxjr.blogspot.com.br/2014/02/using-entity-framework-6-with-npgsql-210.html
I hope it helps.