2011-11-07 18 views
5

Tengo una base de datos SqlServer Compact Edition que contiene 2 tablas.¿Puedo tener 2 contextos EntityFramework diferentes para compartir una única base de datos SqlServer Compact?

Para cada una de estas tablas, tengo una clase de contexto derivada de DbContext que la aplicación utiliza para acceder a la tabla.

Para mantener desacoplados los diferentes componentes de la aplicación, no puedo tener una clase de contexto que tenga las propiedades DbSet para ambas tablas. Por el contrario, necesito tener 2 clases de contexto diferentes, cada una de ellas tiene que ser completamente ajena a la otra y sus datos.

Estoy utilizando el enfoque de primer código, mi código define las entidades y el modelo, y dejo que Entity Framework cree la base de datos para mí.

Mi problema es: ¿cómo puedo permitir que Entity Framework cree la base de datos y las tablas automáticamente en la inicialización del contexto, pero aún así los 2 contextos comparten la misma base de datos y conexión?

En este momento lo que se ve es, el primer contexto crea correctamente la base de datos y la tabla en ella, pero cuando intento crear el segundo contexto, estoy consiguiendo, como era de esperar el siguiente error:

The model backing the 'SomeObjectContext' context has changed since the database 
was created. Either manually delete/update the database, or call Database.SetInitializer 
with an IDatabaseInitializer instance. For example, the DropCreateDatabaseIfModelChanges 
strategy will automatically delete and recreate the database, and optionally seed it with 
new data. 

Ninguno de los IDatabaseInitializer disponibles es apropiado para mí, porque no quiero que se elimine toda la base de datos cuando se crea el segundo contexto. Solo quiero que se cree la tabla del segundo contexto en la base de datos existente.

Cualquier consejo sobre cómo resolver esto sería apreciado.

Gracias

Respuesta

5

No puede utilizar CodeFirst esta manera con una sola base de datos. CodeFirst tiene que verificar las clases de modelo contra la estructura de db para que funcionen correctamente (tienen que estar "sincronizados").

In order to keep the different components of the application decoupled, I can't have one context class that would have DbSet properties for both of the tables. Rather, I need to have 2 different context class, each of them has to be completely unaware of the other and its data.

Si las tablas de la cabina no tienen conexiones entre sí y es un requisito para su aplicación a tener estas mesas separadas por completo, ¿por qué no crear dos bases de datos y tienen un contexto para cada uno de ellos?

En general, me gustaría ir con una base de datos, tener una interna DbContext y dos clases de repositorio público diferentes que encapsulan el acceso a las dos tablas. Si todo su código está dentro del mismo conjunto, puede acceder a su contexto interno desde su clase de repositorio. Alguien que necesita acceso al repositorio puede acceder al repositorio para la tabla que necesita.

+2

Se vuelve problemática en un entorno como Sql Azure donde te cobran por base de datos ... – Clement

2

Sí, puede usar contexto de múltiples DB apuntando a la misma base de datos.

Arthur Vickers del equipo de Entity Framework recomienda el siguiente patrón ....

En lugar de especificar cadenas de conexión separadas en su archivo app.config para contexto múltiple, simplemente establezca una cadena y asígnele un nombre genérico.

<connectionStrings> 
     <add name="MyDBContext" connectionString="Your conn string here" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

A continuación, cree una clase de contexto de base que utilizará la cadena de conexión:

using System.Data.Entity; 

namespace DataLayer 
{ 
    public class BaseContext<TContext> : DbContext where TContext : DbContext 
    { 
     static BaseContext() 
     { 
      Database.SetInitializer<TContext>(null); 
     } 
     protected BaseContext() 
      : base("name=MyDBContext") 
     { 
     } 

    } 
} 

Ahora, heredan este comportamiento de base en cada contexto (por ejemplo):

namespace DataLayer.Models 

    { 
     public class OrderContext : BaseContext<OrderContext> 

    … 

    namespace DataLayer.Models 
    { 
     public class ProductContext : BaseContext<ProductContext> 
    … 
+0

Gracias por responder. Mi pregunta era específicamente para una base de datos SqlServer CE, y creo que el enfoque que describes en la respuesta no resuelve el problema que tenía. El problema específicamente fue con la forma en que el código primero y CE funcionó. – Ran

+0

Lo siento Ran. Puede haber malentendido tu pregunta ... – tom33pr

Cuestiones relacionadas