【发布时间】:2015-01-20 01:46:03
【问题描述】:
在使用包Npsql 和Npsql.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<T> 的类 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