如何禁用 MARS 并规避“MARS 尚未实现”异常”

本文关键字:MARS 实现 异常 何禁用 | 更新日期: 2023-09-27 18:31:37

在 Mono 上使用包将 PostgreSQL 数据库与实体框架一起使用时NpsqlNpsql.EntityFramework我在尝试从控制台应用程序运行 Code First 迁移时出现异常。连接在应用中工作,并且可以通过编程方式对数据库进行 CRUD。

Context类如下所示:

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; } 
}

此外,还有一个派生自DbMigrationsConfiguration<T>的类配置,如下所示:

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

PostgreSqlMigrationSqlGenerator类来自这个PostgreSqlMigrationSqlGenerator存储库(默认SqlGenerator会弹出相同的错误,因此代码不是问题)。

我尝试通过这个想法从控制台应用程序运行配置,如下所示,这是可能的,因为 PowerShell 命令"只是底层 API 上的精简包装器":

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

不幸的是,添加此错误弹出的MigrationScaffolder(config)语句:

System.NotImplementException已被抛出。火星计划尚未实施!

多个活动结果集 (MARS) 显然尚未在 Mono 中实现。Mono 框架中的类System.Data.SqlClient.SqlConnectionStringBuilder负责。如果您点击代码的链接,您可以看到在line 797抛出异常:

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;

SetValue (string key, object value)方法中。

我的问题是:有没有办法推迟 MARS 并让迁移生成器不抛出异常?

/edit 将;MultipleActiveResultSets=False追加到连接字符串无济于事,因为它不是 PostgreSQL 连接字符串的有效属性。此外,在ZkContext上下文类上设置Configuration.LazyLoadingEnabled = false;也无济于事。

/编辑调用堆栈:

System.Data.SqlClient.SqlConnectionStringBuilder.SetValue (key="multipleactiveresultsets", value="True") in System.Data.SqlClient.SqlConnectionStringBuilder.set_Item (关键字="多个活动结果集", 值="真") System.Data.Common.DbConnectionStringBuilder.ParseConnectionStringNonOdbc (connectionString="Data Source=.''SQLEXPRESS;集成安全性 = 真;MultipleActiveResultSets=True;")在
System.Data.Common.DbConnectionStringBuilder.ParseConnectionString (connectionString="Data
Source=.''SQLEXPRESS;集成安全性 = 真;MultipleActiveResultSets=True;"
)在
System.Data.Common.DbConnectionStringBuilder.set_ConnectionString (value="
Data Source=.''SQLEXPRESS;集成安全性 = 真;MultipleActiveResultSets=True;")在
System.Data.SqlClient.SqlConnectionStringBuilder..ctor (connectionString="Data
Source=.''SQLEXPRESS;集成安全性 = 真;MultipleActiveResultSets=True;")在
System.Data.Entity.Infrastructure.SqlConnectionFactory.CreateConnection
(nameOrConnectionString="ZkTestDatabaseConnection") in
System.Data.Entity.Internal.LazyInternalConnection.Initialize () in
System.Data.Entity.Internal.LazyInternalConnection.get_Connection () 在
System.Data.Entity.Internal.LazyInternalContext.get_Connection () in
System.Data.Entity.Infrastructure.DbContextInfo..ctor (contextType={Zk.Models.ZkContext},
modelProviderInfo=(null), config={System.Data.Entity.Internal.AppConfig}, connectionInfo=(null
), resolver=(null)) in
System.Data.Entity.Infrastructure.DbContextInfo..ctor (contextType={Zk.Models.ZkContext},
resolver=(null)) in
System.Data.Entity.Infrastructure.DbContextInfo..ctor (contextType={Zk.Models.ZkContext}) in
System.Data.Entity.Migrations.DbMigrator..ctor (configuration=
{Zk.Migrations.Configuration}, usersContext=(null),
existState=System.Data.Entity.Internal.DatabaseExistState.Unknown,
calledByCreateDatabase=false) in
System.Data.Entity.Migrations.DbMigrator..ctor (configuration=
{Zk.Migrations.Configuration}) in
System.Data.Entity.Migrations.Design.MigrationScafffolder..ctor (migrationsConfiguration=
{Zk.Migrations.Configuration}) in
Zk.Migrations.MigrationsTool.Main (args={string[0]}) in/home/erwin/zaaikalender
/Zk.Migrations/MigrationsTool.cs:23

粗体连接字符串不是指定的连接字符串。

如何禁用 MARS 并规避“MARS 尚未实现”异常”

没有必要禁用 MARS。从显式堆栈跟踪可以看出,我的上下文使用了默认连接字符串。发生这种情况是因为我正在控制台应用程序中从单独的项目运行迁移。

当我将默认项目(DbContext所在的位置)web.config中的某些信息复制到构建器编译的控制台应用程序的app.config时。

迁移正在工作 (!),并且不再发生 MARS 错误,因为现在采用了正确的连接字符串。

迁移项目中app.config重复的 xml 配置:

<?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>