雖然在Mono上使用包含實體框架的PostgreSQL數據庫Npsql
和Npsql.EntityFramework
當嘗試從控制檯運行Code First遷移時遇到異常。應用程序的連接並在應用程序運行和數據庫可通過編程方式CRUD'ed如何禁用MARS並規避「MARS尚未實現」-exception「?
的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
類來自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尚未實施!
多活動結果集(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關閉,並讓遷移生成器不拋出異常?
/編輯將;MultipleActiveResultSets=False
附加到連接字符串不起作用,因爲它不是PostgreSQL連接字符串的有效屬性。此外,在ZkContext
上下文類中設置Configuration.LazyLoadingEnabled = false;
也無濟於事。
/編輯調用堆棧:
System.Data.SqlClient.SqlConnectionStringBuilder.SetValue(鍵= 「multipleactiveresultsets」,值= 「真」)的 System.Data.SqlClient.SqlConnectionStringBuilder.set_Item(關鍵字)
System.Data中的 System.Data.Common.DbConnectionStringBuilder.ParseConnectionStringNonOdbc(connectionString =「Data Source =。\ SQLEXPRESS; Integrated Security = True; MultipleActiveResultSets = True;」)=「multipleactiveresultsets」,value =「True」 .Common.DbConnectionStringBuilder.ParseConnectionString(connectionString =「Data
S烏爾斯河= \ SQLEXPRESS。集成安全性=真; MultipleActiveResultSets = True;「)in
System.Data.Common.DbConnectionStringBuilder.set_ConnectionString(value =」Data
Source =。\ SQLEXPRESS;集成安全性=真; MultipleActiveResultSets = TRUE; 「在
System.Data.SqlClient.SqlConnectionStringBuilder..ctor(的connectionString =)」 數據
源= \ SQLEXPRESS;集成安全性= TRUE; MultipleActiveResultSets =真;「)中
System.Data.Entity的.Infrastructure.SqlConnectionFactory.CreateConnection
在
System.Data.Entity.Internal.LazyInternalConnection.Initialize()在
System.Data.Entity.Internal.LazyInternalConnection.get_Connection()在
系統(nameOrConnectionString = 「ZkTestDatabaseConnection」) .Data.Entity.Internal.LazyInternalContext.get_Connection()in
System.Data.Entity.Infrastructure.DbContex tInfo..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})
System.Data.Entity.Migrations.DbMigrator..ctor(configuration =
{Zk.Migrations.Configuration},usersContext =(null),
existsState = System.Data.Entity。 Internal.DatabaseExistenceState.Unknown,
calledByCreateDatabase = false)
System.Data.Entity.Migrations.DbMigrator..ctor(配置=
{Zk.Migrations.Configuration})在
System.Data.Entity.Migrations.Design.MigrationScaffolder..ctor(migrationsConfiguration =
{Zk.Migrations .Configuration})在
Zk.Migrations.MigrationsTool.Main(參數= {串[0]})在/ home /歐文/ zaaikalender
/Zk.Migrations/MigrationsTool.cs:23
的粗體連接字符串不是指定的連接字符串。
注:.NET將會跨平臺和開源的;所以沒有更多的單聲道!雖然今天可能不會幫助你*。 – BradleyDotNET 2014-11-21 20:21:30
那麼這將是Mono和.NET之間的合作,而不是重建。由於.NET核心現在是開源的,微軟將在Mono緊密合作的情況下爲Mono提供全面支持,因此可以更輕鬆地修復和實施錯誤和缺失功能。 /編輯更正:似乎Mono和.NET將保持分離? ([來源](http://www.theregister.co.uk/2014/11/12/release_microsoft_net_from_its_windows_chains_mono_and_xamarin_guy_miguel_de_icaza_on_open_source_net/))。無論如何,也許你會看到如何不進入上面的Case語句?:-) – 2014-11-21 20:30:53
只是檢查顯而易見的 - 你有連接字符串配置中的'MultipleActiveResultSets'設置嗎? – Rhumborl 2014-11-21 20:33:00