Ho una libreria di classi che uso da più di un anno e che ha recentemente smesso di funzionare dopo l'aggiornamento a EF 6.1.
Ho provato vari metodi per passare la stringa di connessione al mio costruttore della classe Context ma mentre sembra che passi correttamente la stringa invariabilmente ricevo:
'(((System.Data.Entity.DbContext) (contesto)). Database.Connection) .ServerVersion' ha generato un'eccezione di tipo 'System.InvalidOperationException'
e lo stato della connessione rimane chiuso.
Ecco la mia AppConfig:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
</startup>
<connectionStrings>
<add name="MyContext" connectionString="Data Source=Server;Initial Catalog=DBName;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>
<entityFramework>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
La mia lezione di prova:
using System.Data.Entity;
namespace SVMIC.IMS.Entity.IMSClaim
{
public class Context:DbContext
{
static Context()
{
Database.SetInitializer<Context>(null);
}
public Context():base("MyContext")
{
}
}
}
e la mia app di prova:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SVMIC.IMS.Entity.IMSClaim;
namespace TestApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Context context = new Context();
}
}
}
Il server database è SQL Server 2008 R2.
Presumo che sia qualcosa di semplice cambiato in 6.1 e mi manca solo, ma sono totalmente perplesso.
Ok, ho risolto il problema.
Per la frustrazione di non essere stato in grado di risolvere il problema con 6.1, nulla di ciò che ho fatto ha fatto alcuna differenza nel risultato, e anche la creazione e l'attraversamento della sorgente EF sono stati di poco conto, quindi sono tornato su EF 5.0 e ho ricostruito il mio codice.
EF 5 ha restituito immediatamente un messaggio di errore che identificava un problema nella definizione dello schema, una vista aggiunta da un altro sviluppatore che faceva riferimento alle viste di sistema confondeva il mio modello, ho risolto il problema e tornavo a funzionare in pochi minuti.
La lezione appresa qui è stata, EF 6 ha bisogno di un lavoro serio sulla sua gestione degli errori, in quanto il solo ritorno di un errore di eccezione generica mi ha lasciato inseguendo in ogni direzione, mentre il messaggio di errore di EF 5 mi ha indirizzato direttamente al problema.
Se si sta lavorando su un file MDF locale, l'aggiornamento del percorso della cartella del file MDF in App.config / Web.config else copia il dbmx App.cofig connectionStrings e lo incolla nel file App.config / Web.config del progetto.