2013-07-01 14 views
19

Gdy czerpiesz z DbContext i używasz konstruktora bez parametrów, załaduje on ciąg połączenia z web.config. Istnieje również możliwość jawnego określenia metody connectionString przy użyciu jednego z innych konstruktorów DbContext.Entity Framework: DbContext i ustawienie ProviderName

Moja szczególna sytuacja nakazuje, że nie można określić ciągu połączenia w pliku web.config, ponieważ lokalizacja serwera/nazwy użytkownika i hasła jest określana w czasie wykonywania. Łatwa naprawa, prawda? Wystarczy użyć wyżej wymienionego konstruktora, aby określić ciąg połączenia? Źle.

Problem polega na tym, że podczas określania ciągu połączenia za pomocą wspomnianego konstruktora nadal próbuje on korzystać z domyślnego dostawcy, więc jeśli używasz jednego lub więcej niestandardowych dostawców, tak jak ja, to nie zadziała.

Jestem pewien, że mogę zmienić domyślnego dostawcę w web.config, ale chcę użyć wielu dostawców, więc nie zrobię tego.

Jedynym możliwym sposobem obejścia tego jest użycie ObjectContext zamiast DbContext, który wydaje się umożliwiać określenie dostawcy wraz z ciągiem połączenia z bazą danych.

Czy jest jakiś inny sposób na zrobienie tego? Czy moje obejście jest dość uzasadnione?

Wierzę, że mogę również utworzyć DbContext z instancji ObjectContext.

+1

Można użyć konstruktora, że ​​trwa 'DbConnection'. –

+0

Moją obawą jest to, że sam będę zarządzał życiem DbConnection. Nie jestem też całkowicie pewien, jak utworzyć DbConnection przy użyciu określonego dostawcy. – NoPyGod

Odpowiedz

24

Utwórz DbConnection ręcznie i przekazać go do konstruktora DbContext następująco:

var conn = DbProviderFactories.GetFactory("MY_CONN_PROVIDER").CreateConnection(); 
conn.ConnectionString = "MY_CONN_STR"; 

new DbContext(conn, true); 

Zawiadomienie drugi parametr bool contextOwnsConnection jest true. Ponieważ nie używasz ponownie połączenia w innym miejscu, pozwala kontekstowi zarządzać połączeniem i gdy jest to konieczne.

0

można dostać się do ObjectContext przez IObjectContextAdapter:

((IObjectContextAdapter)context).ObjectContext 

DbContext ("kontekst" powyżej) nadal zawija ObjectContext, więc nie martw się, że będziesz miał nową instancję.

Można instancję DbContext użyciu tego przeciążenia

public DbContext(ObjectContext objectContext, bool dbContextOwnsObjectContext) {} 

na przykład:

public class YourDbContext : DbContext 
{ 
    public YourDbContext() : this(new YourObjectEntities(), dbContextOwnsObjectContext: true) 
    {} 

} 

Następnie można ustawić swój ciąg połączenia wewnątrz YourObjectEntities:

public partial class YourObjectEntities : ObjectContext 
{ 
    public const string ConnectionString = "name=YourEntities"; // Get it from somewhere 

    public YourObjectEntities() : base(ConnectionString, "YourEntities") 
    { 
    // Some initialization, e.g. ContextOptions.LazyLoadingEnabled = false; 
    } 
} 

Jak określić Dostawca jest twoje ćwiczenie.

-1

Spróbuj tak,

public DBDataContext _dataContex; 

public DBDataContext DBContext 
    { 
     get 
     { 
      if (_dataContex== null) 
      { 
       _v= new DBDataContext(ConfigurationManager.ConnectionStrings["yourConnectinString"].ConnectionString); 
      } 
      return _dataContex; 
     } 

    } 
+0

Nie, już tego próbowałem. Tak jak powiedziałem, próbuje użyć domyślnego dostawcy. - Próbowałem jeszcze raz, aby się upewnić - ProviderIncompatableException. – NoPyGod

Powiązane problemy