【问题标题】:How to disable MARS and circumvent "MARS is not yet implemented"-exception"?如何禁用 MARS 并规避“MARS 尚未实现”-异常?
【发布时间】:2015-01-20 01:46:03
【问题描述】:

在使用包NpsqlNpsql.EntityFramework 在 Mono 上使用带有实体框架的 PostgreSQL 数据库时,我在尝试从控制台应用程序运行 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&lt;T&gt; 的类 Configuration,如下所示:

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

PostgreSqlMigrationSqlGenerator 类来自 this PostgreSqlMigrationSqlGenerator repository(默认 SqlGenerator 会弹出相同的错误,因此代码不是问题)。

我尝试通过this idea 从控制台应用程序运行配置,如下所示,这是可能的,因为 PowerShell 命令“只是底层 API 的瘦包装器”:

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

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

System.NotImplementedException 已被抛出。 MARS 尚未实施!

Multiple Active Result Sets (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; 也无济于事。

/edit 调用栈:

System.Data.SqlClient.SqlConnectionStringBuilder.SetValue (key="multipleactiveresultsets", value="True") 在 System.Data.SqlClient.SqlConnectionStringBuilder.set_Item (keyword="multipleactiveresultsets", value="True") 在 System.Data.Common.DbConnectionStringBuilder.ParseConnectionStringNonOdbc (connectionString="Data Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True;") 在
System.Data.Common.DbConnectionStringBuilder.ParseConnectionString (connectionString="Data
Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True;"
) in
System.Data.Common.DbConnectionStringBuilder.set_ConnectionString (value="Data
Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True;") in
System.Data.SqlClient.SqlConnectionStringBuilder..ctor (connectionString="Data
Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True;") in
System.Data.Entity.Infrastructure.SqlConnectionFactory.CreateConnection
(nameOrConnectionString="ZkTestDatabaseConnection") in

中的System.Data.Entity.Internal.LazyInternalConnection.Initialize() System.Data.Entity.Internal.LazyInternalConnection.get_Connection() in

中的System.Data.Entity.Internal.LazyInternalContext.get_Connection() System.Data.Entity.Infrastructure.DbContextInfo..ctor (contextType={Zk.Models.ZkContext},
modelProviderInfo=(null), config={System.Data.Entity.Internal.AppConfig},
connectionInfo =(null), resolver=(null)) 在
System.Data.Entity.Infrastructure.DbContextInfo..ctor (contextType={Zk.Models.ZkContext},
resolver=(null)) in

中的 System.Data.Entity.Infrastructure.DbContextInfo..ctor (contextType={Zk.Models.ZkContext}) System.Data.Entity.Migrations.DbMigrator..ctor (configuration=
{Zk.Migrations.Configuration}, usersContext=(null),
existenceState=System.Data.Entity.Internal.DatabaseExistenceState.Unknown, calledByCreateDatabase=false) 在

中的 System.Data.Entity.Migrations.DbMigrator..ctor (configuration=
{Zk.Migrations.Configuration}) System.Data.Entity.Migrations.Design.MigrationScaffolder..ctor (migrationsConfiguration=
{Zk.Migrations.Configuration}) 在
Zk.Migrations.MigrationsTool.Main (args={string[0]}) 在 /home/erwin/zaaikalender
/Zk.Migrations/MigrationsTool.cs:23

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

【问题讨论】:

  • 注意:.NET 正在跨平台和开源;所以没有更多的单声道!不过今天可能对你没有帮助。
  • 这将是 Mono 和 .NET 之间的合作,而不是重建。由于 .NET 核心现在是开源的,而且微软将在紧密合作的同时全力支持 Mono,因此可以更轻松地修复和实施错误和缺失的功能。 /Edit 更正:似乎 Mono 和 .NET 将保持分离? (Source)。无论如何,也许你看到了如何不进入上面的案例陈述? :-)
  • 只是检查显而易见的 - 你的连接字符串配置中有MultipleActiveResultSets 设置吗?
  • 对不起,没有。我不太熟悉迁移工具 mono 与 .NET 的区别(除了缺少 WPF :( ),所以我不会在这里使用太多。
  • @Rhumborl 我已经通过附加 MultipleActiveResultSets=False 更新了我的连接字符串(默认情况下为 false),这没有帮助。

标签: c# entity-framework postgresql mono npgsql


【解决方案1】:

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

当我将默认项目的web.config 中的一些信息(DbContext 所在的位置)复制到构建器编译的控制台应用程序的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> 

【讨论】:

    猜你喜欢
    • 2015-10-27
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多