2014-06-16 22 views
11

Używam EF6 w bibliotece klasy (pierwszej bazy)Przechodząc String Connection do Entity Framework 6

Kiedy następuje kreatora i dodaje moje tabele Wybrałem nie przechowywać ciąg połączenia w app.config i że Wysłałbym ciąg połączeń.

Nie robiłem tego wcześniej. Zazwyczaj wybieram umieszczenie łańcucha połączenia w pliku app.config.

Jestem teraz całkowicie zaskoczony, jak faktycznie wywołuję funkcję i przekazuję do niej ciąg połączenia.

Poniżej znajdują się, mam nadzieję, istotne fragmenty kodu z mojego rozwiązania.

W app.config - EF automatycznie dodanych w tym:

<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> 

Moje auto generowane klasa kontekst wygląda następująco:

//------------------------------------------------------------------------------ 
// <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; } 
} 
} 

Ostatecznie Próbuję wywołać następującą funkcję testową:

public static List<Customer> customersToUpdate() 
    { 
     cerviondemoEntities db; 

     using (db = new DatabaseModel.cerviondemoEntities()) 
     { 
      var result = from customers in db.Customers 
         select customers; 

      return result.ToList(); 
     } 
    } 

Nie mogę się dowiedzieć, jak wysłać ciąg połączenia z tą funkcją :(

Każda pomoc będzie bardzo ceniona!

Odpowiedz

28

Umownie, Entity Framework wykonuje ciąg połączenia, który ma taką samą nazwę jak kontekstu. Na przykład:

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

klasie DbContext ma konstruktora, który pobiera ciąg połączenia. Możesz dodać kolejny konstruktor, który pobiera parametr connectionstring jako parametr i przekazuje go do konstruktora podstawowego.

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

Należy utworzyć klasę częściową, aby dodany konstruktor nie został nadpisany.

Próbka 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> 
+3

Alternatywnie, można go dodać do pliku .tt zamiast tworzyć kolejny plik i za pomocą „” – Daniel

+0

Dzięki częściowej nie działa z v. 6.1.3 Czy możesz podać, co jest potrzebne w pliku app.config, aby działał? Podaj także przykładowy ciąg połączenia, który sprawia, że ​​twoja odpowiedź działa –

+0

Dodałem przykładowy łańcuch połączeń. –

3

Trzeba wprowadzić inny konstruktor w swoim kontekście, że spodziewa się string connectionString argument i uczynić go nazwać base(string nameOrConnectionString):

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

miałem tego problemu, jak również i stosowane metody Daniel w komentarzach.

Alternatywnie, można go dodać do pliku .tt zamiast tworzyć kolejny plik i za pomocą 'częściowy' - Daniel K 9 Grudzień '16 na 19:16

Aktualizacji * .Context. tt pliku

prostu zastąpić linie ...

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

z następujących ...

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

public <#=code.Escape(container)#>(String nameOrConnectionString) 
    : base(nameOrConnectionString) 
{ 

Mam nadzieję, że to pomoże.

1

Użyłem ciąg połączenia tak, podmiot ciąg połączenia zamiast napisu normalne połączenie

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; 
    } 
Powiązane problemy