2010-06-25 5 views
8

En el trabajo actualmente tenemos una aplicación web muy grande con una conexión a una base de datos masiva. Hemos estado utilizando Entity Framework por un tiempo y para facilitar las cosas dividimos la base de datos en muchos modelos de Entity. Esto funciona bien para nosotros, pero nos encontramos con un problema. Cada modelo EF necesita su propia cadena de conexión debido a la parte de metadatos de la cadena de conexión. Manejar tantas cadenas de conexión es un problema.Cadena de conexión única con múltiples modelos de marcos de entidades?

Ahora tengo una solución que creo que funcionará. Voy a crear una clase que tendrá la información de metadatos guardada como una propiedad también concatenada a la cadena de conexión estándar en el web.config. Entonces, cuando usamos la cadena de conexión "Database.EntityConnectionString", me dará la cadena de conexión de entidad, pero solo tenemos que administrar una única cadena de conexión en el web.config. Todavía tendremos que gestionar la clase con los metadatos, pero los Modelos no cambian mucho y no los creamos a menudo, por lo que el mantenimiento debería ser correcto. Mi pregunta, ¿hay una mejor manera de tratar este problema o cómo lo harías?

Gracias!

Respuesta

7

Esta es la forma en que he aplicado mi solución a este problema:

namespace DBLibrary 
{ 
    public enum Models 
    { 
     Model1, 
     Model2  
    } 

    public static class Database 
    { 
     public static string EntitiesConnectionString(Models model) 
     { 
      SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["Default"].ConnectionString); 

      builder["MultipleActiveResultSets"] = true; 
      builder["Connect Timeout"] = 30; 

      EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); 
      entityBuilder.Provider = "System.Data.SqlClient"; 
      entityBuilder.ProviderConnectionString = builder.ConnectionString; 

      switch (model) 
      { 
       case Models.Model1: 
        entityBuilder.Metadata = "res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl"; 
        return entityBuilder.ToString(); 
       case Models.Model2: 
        entityBuilder.Metadata = "res://*/Model2.csdl|res://*/Model2.ssdl|res://*/Model2.msl"; 
        return entityBuilder.ToString(); 
       default: 
        throw new Exception("Invalid model, no connection string defined"); 
      } 
     } 
    } 
} 

todavía tengo que limpiar el código y todo, pero yo creo que esto le dará una buena idea de cómo esto puede ser implementado. Todavía estaría muy interesado si hay diferentes y mejores formas de hacerlo.

Gracias!

+0

Sé que es un poco viejo, pero ¿Cómo lo utilizo – lostmylogin

0

Tuve el mismo problema. Lo he resuelto de la siguiente manera:

He creado dos archivos edmx, pero al crear el segundo archivo edmx, ignoré la cadena de conexión para guardarla en el archivo de configuración. De esta forma, mi archivo de configuración contendrá solo una cadena de conexión. Luego modifiqué siguientes líneas en mi cadena de conexión:

<add name="MyDbContext" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string=&quot;data source=abc;initial catalog=mydb;persist security info=True;user id=myuser;password=password;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 

basta con sustituir "res: //model1.csdl" con "res: // * /" y funciona como un encanto.

Se puede especificar el nombre de la conexión en el constructor de la clase dbcontext como:

public MyDbContext() : base("name=NameOfYourConnectionString") // Name of your connection string 
{ } 

Nota: Estoy utilizando Entity Framework 5.0.

+0

Esto no funcionará si sus modelos contienen tipos superpuestos (es decir, que haya la misma tabla que se hace referencia en varios modelos) – K0D4

+1

Bueno, para eso puedes cambiar el nombre de entidad duplicado en Edmx. También hice referencia a la misma tabla en el modelo múltiple, pero cambio el nombre del conjunto de entidades en la propiedad de conjunto de entidades de edmx para evitar la duplicación de la entidad. – SoftSan

1

Agregar defecto de construcción en su clase

public class ItemContext : DbContext 
{ 
    public DbSet<Item>Items get; set; } 
    public DbSet<ItemDetail> ItemDetails { get; set; } 

    public ItemContext() 
    { 

     this.Database.Connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
    } 
} 
Cuestiones relacionadas