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>