2013-07-30 16 views
24

Piszę system płac, który będzie zintegrowany z wcześniej istniejącym systemem. Pierwotny system posiadał główną bazę danych, która zajmowała się zarządzaniem użytkownikami i konfiguracją globalną, poniżej znajduje się wiele baz danych o identycznej strukturze, w zasadzie każda baza danych to jedna baza danych płacowych firm, wszystkie są powiązane z główną bazą danych, ponieważ należą do jednostki nadrzędnej. firma, która ma wiele spółek zależnych, każda z własnym działem HR.Korzystanie z struktury encji w wielu bazach danych

Zastanawiam się, czy istnieje sposób, w jaki mogę, na podstawie pliku cookie lub innej metody, która przechowuje nazwę firmy, z którą chcą się połączyć, dynamicznie zmieniać docelową bazę danych obiektu na podstawie danych wejściowych za pomocą filtru ?

Oto przykład:

kłody użytkownikowi w witrynie, strona ładunków o dostępnych firm, które użytkownik ma uprawnienie do dostępu, użytkownik wybierze firmę, mają uprawnienia administratora w tej spółce, dodają pracownika, zanim ta czynność zostanie uruchomiona, asp.net zmieni ciąg połączenia na odpowiednią bazę danych, a następnie doda rekord.

+0

Co najwyżej skończy się z 2 kontekstach, czy istnieją pewne obejścia, ale bardzo mniej praktyczny i oczekuje się EF6 do obsługi wielu Baza danych. Możesz sprawdzić wersję beta, zanim aplikacja będzie gotowa, EF6 zostanie zwolniony. Ale wszystkie bazy danych są częścią jednej organizacji, a następnie łączenie ich z dodatkowym kluczem obcym dla CompanyID spowoduje utworzenie jednego DB i ułatwi raportowanie. –

+1

Ach, widzę, problem polega na tym, że osoba, która stworzyła pierwszy system płac, jest bardzo nieugięta w kwestii zachowania struktury bazy danych, mówi, że firmy będą bardziej skłonne do aktualizacji do nowszej wersji, jeśli nie będą tego robić. t potrzebne są migracje bazy danych. – ChaoticLoki

+0

Cóż, to koszmar utrzymania, nie będziesz w stanie wykonywać zapytań cross db z łączeniami. Nie jestem pewien EF6, ale możesz sprawdzić kodepleks. –

Odpowiedz

5

EF6 ma lepszą obsługę wielu dostępu do bazy danych z tego samego kontekstu. Oto fragment z EF5. Ważne jest zarządzanie ustawieniami inicjalizatora bazy danych. Możesz nie chcieć wywoływać ŻADNYCH migracji. tj używać tego wcześniej

Database.SetInitializer(new ContextInitializerNone<MyDbContext>());

jednak odpowiedzieć na pytanie: Tak, można

var conn = GetSqlConn4DbName(dataSource,dbName); 
var ctx = new MyDbContext(conn,true); 



public DbConnection GetSqlConn4DbName(string dataSource, string dbName) { 
     var sqlConnStringBuilder = new SqlConnectionStringBuilder(); 
     sqlConnStringBuilder.DataSource = String.IsNullOrEmpty(dataSource) ? DefaultDataSource : dataSource; 
     sqlConnStringBuilder.IntegratedSecurity = true; 
     sqlConnStringBuilder.MultipleActiveResultSets = true; 

     var sqlConnFact = new SqlConnectionFactory(sqlConnStringBuilder.ConnectionString); 
     var sqlConn = sqlConnFact.CreateConnection(dbName); 
     return sqlConn; 
    } 


public class ContextInitializerNone<TContext> : IDatabaseInitializer<TContext> where TContext : DbContext 
{ 
    public void InitializeDatabase(TContext context) { } 
} 

Also see StackOverflow answer using migration, sample code, and dynamic db connection

22

To bardzo proste. Mam:

public WMSEntities() : base("name=WMSEntities") //WMSEntities is conection string name in  web.config also the name of Entitiframework 
{ 
} 

już wygenerowane automatycznie Model.Context.cs folderu edmx

Aby połączyć się z bazą danych w czasie wykonywania wielokrotnych, stworzyłem inny konstruktor, że trwa ciąg połączenia jako parametr jak poniżej w tym samym pliku modelu. Context.cs

public WMSEntities(string connStringName) 
    : base("name=" + connStringName) 
{ 
} 

teraz dodałem drugi ciąg połączenia w pliku web.config na przykład

<add name="WMSEntities31" connectionString="data source=TESTDBSERVER_NAME;initial catalog=TESTDB;userid=TestUser;password=TestUserPW/> 

<add name="WMSEntities" connectionString="data source=TESTDBSERVER_NAME12;initial catalog=TESTDB12;userid=TestUser12;password=TestUserPW12/> 

Następnie, podczas łączenia się z bazą danych Zadzwonię poniżej metody przekazując nazwę connetionString jako parametr

public static List<v_POVendor> GetPOVendorList(string connectionStringName) 
{ 
    using (WMSEntities db = new WMSEntities(connectionStringName)) 
    {    
     vendorList = db.v_POVendor.ToList();     
    } 
} 
+0

Witam ,, to wygląda świetnie .... moje zapytanie jest, jeśli to jakikolwiek model bazy danych zmienić, jak to będzie wpływ. to będzie koszmar utrzymania? – niku

+0

Czym ponownie generujemy plik model.cs, musimy ponownie dodać konfigurację 'public WMSEntities (string connStringName) : base (" name = "+ connStringName) { }' –

Powiązane problemy