framework conexion cambiar cadena c# entity-framework

c# - conexion - Pasando la cadena de conexión al Entity Framework 6



cambiar cadena de conexion entity framework (4)

He usado la cadena de conexión como esta, la cadena de conexión de entidad en lugar de la cadena de conexión normal

SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder() { DataSource = "SOURAV-PC", // Server name InitialCatalog = "efDB", //Database UserID = "sourav", //Username Password = "mypassword", //Password }; //Build an Entity Framework connection string EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder() { Provider = "System.Data.SqlClient", Metadata = "res://*/testModel.csdl|res://*/testModel.ssdl|res://*/testModel.msl", ProviderConnectionString = sqlString.ToString() }; return entityString.ConnectionString; }

Estoy usando EF6 en una biblioteca de clases (la base de datos primero)

Cuando seguí el asistente y agregué mis tablas, seleccioné no almacenar la cadena de conexiones en el archivo app.config y que enviaría la cadena de conexiones.

No he hecho esto antes. Normalmente selecciono poner la cadena de conexión en el archivo app.config.

Ahora estoy completamente sorprendido de cómo llamo a una función y le paso la cadena de conexión.

A continuación encontrará lo que espero sean fragmentos de código relevantes de mi solución.

En el archivo app.config - EF automáticamente agregó esto:

<connectionStrings> <add name="cerviondemoEntities" connectionString="metadata=res://*/DatabaseModel.cervionEDM.csdl|res://*/DatabaseModel.cervionEDM.ssdl|res://*/DatabaseModel.cervionEDM.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=DEVBOX;initial catalog=cerviondemo;user id=sa;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> </connectionStrings>

Mi clase de contexto generada automáticamente se ve así:

//------------------------------------------------------------------------------ // <auto-generated> // This code was generated from a template. // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ namespace CervionFunctions.DatabaseModel { using System; using System.Data.Entity; using System.Data.Entity.Infrastructure; public partial class cerviondemoEntities : DbContext { public cerviondemoEntities() : base("name=cerviondemoEntities") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { throw new UnintentionalCodeFirstException(); } public virtual DbSet<Customer> Customers { get; set; } public virtual DbSet<Ticket> Tickets { get; set; } } }

En última instancia, estoy tratando de llamar a la siguiente función de prueba:

public static List<Customer> customersToUpdate() { cerviondemoEntities db; using (db = new DatabaseModel.cerviondemoEntities()) { var result = from customers in db.Customers select customers; return result.ToList(); } }

No puedo averiguar cómo enviar la cadena de conexión a esa función :(

Cualquier ayuda sería muy apreciada!


Por convención, Entity Framework toma la cadena de conexión que tiene el mismo nombre que el contexto. Por ejemplo:

public cerviondemoEntities() : base("name=cerviondemoEntities") { }

La clase DbContext tiene un constructor que toma una cadena de conexión. Puede agregar otro constructor que toma una cadena de conexión como parámetro y pasarlo al constructor base.

public cerviondemoEntities(string connectionString) : base(connectionString) { }

Asegúrese de crear una clase parcial para que el constructor agregado no se sobrescriba.

Muestra ConnectionString:

<connectionStrings> <add name="cerviondemoEntities" connectionString="data source=server/database;initial catalog=catalog;persist security info=True;user id=user;password=password;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> </connectionStrings>


También tuve este problema y utilicé el método de Daniel en los comentarios.

Alternativamente, puede agregarlo al archivo .tt en lugar de crear otro archivo y usar ''parcial'' - Daniel K, 9 de diciembre de 16 a las 19:16

Actualizar * .Context.tt Archivo

simplemente reemplace las líneas ...

public <#=code.Escape(container)#>() : base("name=<#=container.Name#>") {

con lo siguiente...

public <#=code.Escape(container)#>() : this("name=<#=container.Name#>") { } public <#=code.Escape(container)#>(String nameOrConnectionString) : base(nameOrConnectionString) {

Espero que esto ayude.


base(string nameOrConnectionString) introducir otro constructor en su contexto que esté esperando un argumento de string connectionString y hacer que llame a la base(string nameOrConnectionString) :

public cerviondemoEntities(string connectionString) : base(connectionString) { }