2014-06-19 21 views
5

Czy ktoś może mi pomóc zrozumieć następujące dwa podejścia do przekazania ciągu połączenia z DbContext?Entity Framework Konstruktor DbContext z ciągiem połączeń

Podejście nr 1:

public EWebDBContextEMS() : base("mainConnectionString") 
{ 
} 

i podejście nr 2:

public EWebDBContextEMS() : base("name=mainConnectionString") 
{ 
} 

This article states że name=... dostanie stworzony przez projektanta, ale ja testowałem z czystego kodu DbContext, to działa również.

Czy jest to zamierzone zachowanie konstruktora DbContext? I w documentation, nie wspomina, że ​​name= jest dopuszczalne dla ciągu połączenia.

Dziękujemy

Odpowiedz

4

klasy Uwagi DBContext klasie mają pełne wyjaśnienie.
W skrócie:

  • Pierwszym przykładem może doprowadzić do bazy danych o nazwie „mainConnectionString” tworzony.
  • name = xxxx wygląda w app.config dla connectionStrings wg nazwy

Niektóre narzędzia należy umieszczać wpisy w app.config dla Ciebie.
Połączona dokumentacja online stwierdza dokładnie, gdzie jest pomoc.

Pomoc online mówi:

Tworzy nową instancję kontekstowe stosując dane ciąg jako ciąg do bazy danych, do której połączenie zostanie wykonane nazwa lub połączenia. Zobacz uwagi dotyczące klasy, aby dowiedzieć się, w jaki sposób jest to używane do utworzenia połączenia .

Jeśli pójdziesz do klasy Uwagi znajdziesz pełne wyjaśnienie ....

///    The connection to the database (including the name of the database) can be specified in several ways. 
///    If the parameterless DbContext constructor is called from a derived context, then the name of the derived context 
///    is used to find a connection string in the app.config or web.config file. If no connection string is found, then 
///    the name is passed to the DefaultConnectionFactory registered on the <see cref="T:System.Data.Entity.Database"/> class. The connection 
///    factory then uses the context name as the database name in a default connection string. (This default connection 
///    string points to .\SQLEXPRESS on the local machine unless a different DefaultConnectionFactory is registered.) 
///    Instead of using the derived context name, the connection/database name can also be specified explicitly by 
///    passing the name to one of the DbContext constructors that takes a string. The name can also be passed in 
///    the form "name=myname", in which case the name must be found in the config file or an exception will be thrown. 
///    Note that the connection found in the app.config or web.config file can be a normal database connection 
///    string (not a special Entity Framework connection string) in which case the DbContext will use Code First. 
///    However, if the connection found in the config file is a special Entity Framework connection string, then the 
///    DbContext will use Database/Model First and the model specified in the connection string will be used. 
///    An existing or explicitly created DbConnection can also be used instead of the database/connection name. 
///    A <see cref="T:System.Data.Entity.DbModelBuilderVersionAttribute"/> can be applied to a class derived from DbContext to set the 
///    version of conventions used by the context when it creates a model. If no attribute is applied then the 
///    latest version of conventions will be used. 
+0

Dziękuję za odpowiedź, to wskazano dokładnej oświadczenie brakowało mi w tym artykule. – Jonathon

+0

"Zobacz uwagi klasowe", "jeśli przejdziesz do uwag klasowych ..." <- zlokalizowanie tego nie jest oczywiste. Jak ich znalazłeś? – redwards510

+0

@ redwards510 Używam Resharpera dotpeek do dekompilacji źródeł. można go zainstalować za darmo. To był darmowy program. Ale są też inne narzędzia, takie jak .net reflector –

1

Pierwsze podejście pozwala na stworzenie własnego pełny ciąg połączenia w czasie wykonywania, a nie ciąg połączenia wymienionych w swojej app.config lub pliku web.config.

Podejście 2 wykorzystuje nazwany ciąg połączenia w plikach konfiguracyjnych.

Stosując podejście 1, a częściowej klasy, który obsługuje budowanie ciąg połączenia, można zbudować ciąg połączenia w czasie wykonywania takich jak:

Konstruktor DbContext akceptuje ciąg połączenia jako parametr. Możesz być lepiej buduje ciąg połączenia i przechodzącej które do konstruktora tak:

użyłem mniej więcej tak:

// the model name in the app.config connection string (any model name - Model1?) 
private static string GetConnectionString(string model, settings) 
{ 
    // Build the provider connection string with configurable settings 
    var providerSB = new SqlConnectionStringBuilder 
    { 
     InitialCatalog = settings.InitialCatalog, 
     DataSource = settings.DataSource, 
     UserID = settings.User, 
     Password = settings.Password 
    }; 

    var efConnection = new EntityConnectionStringBuilder(); 
    // or the config file based connection without provider connection string 
    // var efConnection = new EntityConnectionStringBuilder(@"metadata=res://*/model1.csdl|res://*/model1.ssdl|res://*/model1.msl;provider=System.Data.SqlClient;"); 
    efConnection.Provider = "System.Data.SqlClient"; 
    efConnection.ProviderConnectionString = providerSB.ConnectionString; 
    // based on whether you choose to supply the app.config connection string to the constructor 
    efConnection.Metadata = string.Format("res://*/Model.{0}.csdl|res://*/Model.{0}.ssdl|res://*/Model.{0}.msl", model); ; 
    return efConnection.ToString(); 

} 
Powiązane problemy