Aggiornamento: problema risolto, vedere la fine di questa domanda.
Il problema :
Stiamo cercando di utilizzare Entity Framework 6 e la configurazione basata su codice in uno scenario in cui abbiamo utilizzato sia SQL Server che SQL Server CE nello stesso AppDomain
.
Questo scenario abbastanza semplice sembra non essere supportato "dal design". Dalla squadra EF:
Nota: non supportiamo l'utilizzo di più classi di configurazione nello stesso AppDomain. Se si utilizza questo attributo per impostare diverse classi di configurazione per due contesti, verrà generata un'eccezione.
Ulteriori informazioni qui: Configurazione basata su codice (Codeplex)
La domanda :
Come andiamo avanti da qui? Qualsiasi aiuto sarebbe molto apprezzato! Esiste un modo più flessibile per connettere una configurazione a un contesto anziché a un AppDomain
?
(Le nostre classi di contesto si trovano in diversi assembly. Abbiamo provato l'attributo DbConfigurationType
ma il problema è EF stesso)
File di configurazione:
Configurazione per normale server SQL
public class EfConfiguration : DbConfiguration
{
public EfConfiguration()
{
SetProviderServices(
SqlProviderServices.ProviderInvariantName,
SqlProviderServices.Instance);
SetDefaultConnectionFactory(new SqlConnectionFactory());
}
}
Configurazione per SQL Server Compact Edition
public class EfCeConfiguration : DbConfiguration
{
public EfCeConfiguration()
{
SetProviderServices(
SqlCeProviderServices.ProviderInvariantName,
SqlCeProviderServices.Instance);
SetDefaultConnectionFactory(
new SqlCeConnectionFactory(SqlCeProviderServices.ProviderInvariantName));
}
}
AGGIORNARE:
L'errore che otteniamo è:
System.TypeInitializationException: l'inizializzatore del tipo per "MyProject.Repositories.Base.DataContext" ha generato un'eccezione. ----> System.InvalidOperationException: è stata impostata un'istanza di 'EfCeConfiguration' ma questo tipo non è stato rilevato nello stesso assembly del contesto 'DataContext'. Inserire il tipo DbConfiguration nello stesso assembly del tipo DbContext, utilizzare DbConfigurationTypeAttribute sul tipo DbContext per specificare il tipo DbConfiguration o impostare il tipo DbConfiguration nel file di configurazione. Vedere http://go.microsoft.com/fwlink/?LinkId=260883 per ulteriori informazioni.
AGGIORNAMENTO 2, la soluzione Come descritto sopra, possiamo avere solo una configurazione. Questo è un problema poiché Sql e SqlCe utilizzano provider diversi. Se usiamo "SetDefaultConnectionFactory" per adattarsi ad un tipo di database, l'altro fallirà.
Invece, fornire la connessione nel contesto come descritto nel post contrassegnato come risposta di seguito. Una volta inizializzato sempre il contesto con una connessione anziché una connessione, sei pronto per partire. È possibile rimuovere la chiamata SetDefaultConnectionFactory dalla configurazione. Stiamo utilizzando solo il codice seguente per configurare il contesto SqlCe e nessuna configurazione per il contesto Sql.
public class CommonEfConfiguration : DbConfiguration
{
public CommonEfConfiguration()
{
// EF does not know if the ce provider by default,
// therefore it is required to be informed about it.
// The connection factories are not necessary since the connection
// is always created in the UnitOfWork classes
SetProviderServices(SqlCeProviderServices.ProviderInvariantName, SqlCeProviderServices.Instance);
}
}
EDIT: basato sui dettagli dell'errore: hai già provato a dire a EF dove è stata trovata la classe di configurazione?
[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssemblyFullyQualifiedName")]
public class MyContextContext : DbContext
{
}
Se questo non può essere fatto funzionare, quindi vedere alternativa
Utilizzare il contesto con il costruttore DbConnection
public class MYDbContext : DbContext {
// MIgration parameterless constructor is managed in MyMigrationsContextFactory
public MyDbContext(string connectionName) : base(connectionName) { } // no this
public MYDbContext(DbConnection dbConnection, bool contextOwnsConnection) // THIS ONE
: base(dbConnection, contextOwnsConnection) { }
è quindi necessaria una connessione "DBConnection" per ciascun provider. Per il server SQL
public DbConnection GetSqlConn4DbName(string dataSource, string dbName) {
var sqlConnStringBuilder = new SqlConnectionStringBuilder();
sqlConnStringBuilder.DataSource = String.IsNullOrEmpty(dataSource) ? DefaultDataSource : dataSource;
sqlConnStringBuilder.IntegratedSecurity = true;
sqlConnStringBuilder.MultipleActiveResultSets = true;
var sqlConnFact = new SqlConnectionFactory(sqlConnStringBuilder.ConnectionString);
var sqlConn = sqlConnFact.CreateConnection(dbName);
return sqlConn;
}
ripetere per SqlCe factory, può anche generare un fattore di connessione SQLConnection SqlCe creare una connessione
cosa ho fatto:
public partial class MyDataBaseContext : DbContext
{
public MyDataBaseContext (string ConnectionString)
: base(ConnectionString)
{
}
}