npgsqlconnection framework entityframework c# entity-framework postgresql mono npgsql

c# - framework - Cómo deshabilitar MARS y eludir "MARS aún no está implementado"-excepción "?



npgsqlconnection (1)

Al usar una base de datos PostgreSQL con Entity Framework on Mono usando los paquetes Npsql y Npsql.EntityFramework recibo una excepción al intentar ejecutar migraciones de Code First desde una aplicación de consola. La conexión funciona en la aplicación y la base de datos se puede crudizar programáticamente.

La clase de Context ve de la siguiente manera:

public class ZkContext : DbContext, IZkContext { public ZkContext() : base("ZkTestDatabaseConnection") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // PostgreSQL uses schema public by default. modelBuilder.HasDefaultSchema("public"); } public IDbSet<Crop> Crops { get; set; } }

Además, hay una configuración de clase que se deriva de DbMigrationsConfiguration<T> siguiente manera:

public class Configuration : DbMigrationsConfiguration<ZkContext> { public Configuration () { AutomaticMigrationsEnabled = false; SetSqlGenerator("Npgsql", new PostgreSqlMigrationSqlGenerator()); } }

La clase PostgreSqlMigrationSqlGenerator proviene de este repositorio PostgreSqlMigrationSqlGenerator (el mismo error aparece con el SqlGenerator predeterminado para que el código no sea el problema).

Intento ejecutar la configuración desde una aplicación de consola de la siguiente manera a través de esta idea , que es posible ya que los comandos de PowerShell "son solo envoltorios delgados sobre una API subyacente":

var config = new Configuration(); var scaffolder = new MigrationScaffolder(config); //<= Here it breaks var migration = scaffolder.Scaffold("Initial");

Desafortunadamente, agregue la instrucción MigrationScaffolder(config) este error aparece:

System.NotImplementedException ha sido lanzado. ¡MARS aún no está implementado!

Múltiples conjuntos de resultados activos (MARS) aparentemente no están implementados en Mono todavía. La clase System.Data.SqlClient.SqlConnectionStringBuilder en el marco Mono es responsable. Si sigue el enlace al código, puede ver que en la line 797 se lanza la excepción:

case "MULTIPLEACTIVERESULTSETS": if (value == null) { _multipleActiveResultSets = DEF_MULTIPLEACTIVERESULTSETS; base.Remove (mappedKey); } else if ( DbConnectionStringBuilderHelper.ConvertToBoolean (value)) throw new NotImplementedException ("MARS is not yet implemented!"); break;

en el SetValue (string key, object value) .

Mi pregunta es: ¿hay alguna forma de desactivar MARS y obtener el generador de Migración para no lanzar la excepción?

/ edit Anexar ;MultipleActiveResultSets=False a la cadena de conexión no ayuda, ya que no es una propiedad válida para las cadenas de conexión de PostgreSQL. Además, configurar Configuration.LazyLoadingEnabled = false; en la clase de contexto ZkContext tampoco ayuda.

/ editar la pila de llamadas:

System.Data.SqlClient.SqlConnectionStringBuilder.SetValue (key = "multiplactiveresultsets", value = "True") en System.Data.SqlClient.SqlConnectionStringBuilder.set_Item (keyword = "multiplactiveresultsets", value = "True") en System.Data. Common.DbConnectionStringBuilder.ParseConnectionStringNonOdbc (connectionString = "Data Source =. / SQLEXPRESS; Integrated Security = True; MultipleActiveResultSets = True;") en
System.Data.Common.DbConnectionStringBuilder.ParseConnectionString (connectionString = " Data
Fuente =. / SQLEXPRESS; Seguridad integrada = Verdadero; MultipleActiveResultSets = True; " ) en
System.Data.Common.DbConnectionStringBuilder.set_ConnectionString (value = "Data
Fuente =. / SQLEXPRESS; Seguridad integrada = Verdadero; MultipleActiveResultSets = True; ") en
System.Data.SqlClient.SqlConnectionStringBuilder..ctor (connectionString = "Data
Fuente =. / SQLEXPRESS; Seguridad integrada = Verdadero; MultipleActiveResultSets = True; ") en
System.Data.Entity.Infrastructure.SqlConnectionFactory.CreateConnection
(nameOrConnectionString = "ZkTestDatabaseConnection") en
System.Data.Entity.Internal.LazyInternalConnection.Initialize () en
System.Data.Entity.Internal.LazyInternalConnection.get_Connection () en
System.Data.Entity.Internal.LazyInternalContext.get_Connection () en
System.Data.Entity.Infrastructure.DbContextInfo..ctor (contextType = {Zk.Models.ZkContext},
modelProviderInfo = (null), config = {System.Data.Entity.Internal.AppConfig},
connectionInfo = (null), resolver = (null)) en
System.Data.Entity.Infrastructure.DbContextInfo..ctor (contextType = {Zk.Models.ZkContext},
resolver = (null)) en
System.Data.Entity.Infrastructure.DbContextInfo..ctor (contextType = {Zk.Models.ZkContext}) en
System.Data.Entity.Migrations.DbMigrator..ctor (configuration =
{Zk.Migrations.Configuration}, usersContext = (null),
existenceState = System.Data.Entity.Internal.DatabaseExistenceState.Unknown,
calledByCreateDatabase = false) en
System.Data.Entity.Migrations.DbMigrator..ctor (configuration =
{Zk.Migrations.Configuration}) en
System.Data.Entity.Migrations.Design.MigrationScaffolder..ctor (migrationsConfiguration =
{Zk.Migrations.Configuration}) en
Zk.Migrations.MigrationsTool.Main (args = {string [0]}) en / home / erwin / zaaikalender
/Zk.Migrations/MigrationsTool.cs:23

La cadena de conexión en negrita no es la cadena de conexión especificada.


No fue necesario deshabilitar MARS. Lo que se puede ver en el seguimiento de pila explícito es que mi contexto utilizó una cadena de conexión predeterminada. Esto sucedió porque estaba ejecutando migraciones desde un proyecto separado en una aplicación de consola.

Cuando copié parte de la información en el web.config del proyecto predeterminado (donde residía DbContext ) en el app.config de la aplicación de la consola compilada por el constructor.

Las migraciones están funcionando (!) Y el error MARS ya no ocurre porque ahora se toma la cadena de conexión correcta.

Configuración xml duplicada en el proyecto app.config of migrations:

<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.1.1, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <!-- <connectionStrings configSource="../Zk/ConnectionStrings.config" /> --> <connectionStrings> <clear /> <add name="ZkTestDatabaseConnection" connectionString="Server=localhost;Port=5432;Database=ZkTestDatabase;User Id=zktest;Password=broccoli;CommandTimeout=20;" providerName="Npgsql" /> </connectionStrings> <system.data> <DbProviderFactories> <add name="Npgsql Data Provider" invariant="Npgsql" description="Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql" /> </DbProviderFactories> </system.data> <entityFramework> <defaultConnectionFactory type="Npgsql.NpgsqlFactory, Npgsql" /> <providers> <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" /> </providers> </entityFramework> </configuration>