2014-11-21 17 views
3

雖然在Mono上使用包含實體框架的PostgreSQL數據庫NpsqlNpsql.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

的粗體連接字符串不是指定的連接字符串。

+0

注:.NET將會跨平臺和開源的;所以沒有更多的單聲道!雖然今天可能不會幫助你*。 – BradleyDotNET 2014-11-21 20:21:30

+0

那麼這將是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

+0

只是檢查顯而易見的 - 你有連接字符串配置中的'MultipleActiveResultSets'設置嗎? – Rhumborl 2014-11-21 20:33:00

回答

2

沒有必要禁用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>