Wymyśliłem, co uważam za lepsze rozwiązanie niż wszystkie proponowane do tej pory. Używam domyślnego EntityModelCodeGenerator
, więc być może istnieją inne, lepsze rozwiązania dla innych szablonów - ale to działa na mnie:
- Tworzenie drugą połowę częściowej klasy
MyEntities
.
- Zastąpienie
OnContextCreated()
, która jest wywoływana z poziomu konstruktora klasy.
- Zmień ciąg połączenia sklepu za pomocą wyrażenia regularnego.
To wychodzi następująco:
partial void OnContextCreated()
{
// change connection string, depending on subdomain
if (HttpContext.Current == null) return;
var host = HttpContext.Current.Request.Url.Host;
var subdomain = host.Split('.')[0];
switch (subdomain)
{
case "foo":
ChangeDB("Foo");
break;
case "bar":
ChangeDB("Bar");
break;
}
}
private void ChangeDB(string dbName)
{
var ec = Connection as EntityConnection;
if (ec == null) return;
var match = Regex.Match(ec.StoreConnection.ConnectionString, @"Initial Catalog\s*=.*?;", RegexOptions.IgnoreCase);
if (!match.Success) return;
var newDbString = "initial catalog={0};".Fmt(dbName);
ec.StoreConnection.ConnectionString = ec.StoreConnection.ConnectionString.Replace(match.Value, newDbString);
}
Dlaczego nie uruchamiasz ich jako dwóch oddzielnych witryn z różnymi konfiguracjami sieci? W ten sposób możesz ustawić ciągi połączeń w pliku konfiguracyjnym. Byłoby znacznie łatwiejsze i łatwiejsze w utrzymaniu niż zakłócanie ciągów połączeń za każdym razem, gdy deklarujesz kontekst. –
@DoctorJones Ponieważ wtedy muszę wdrożyć do wielu stron internetowych za każdym razem, gdy naprawię błąd lub dodaję funkcję. –
@shaul przekazanie połączenia w użyciu iniekcji zależności byłoby jednym z najlepszych rozwiązań problemu. Używanie fabryki DbContext sparametryzowanej na stronie nazwa byłoby inne. Jeśli twój kod nie pozwala ci to zrobić, potraktuj to jako okazję do poprawy i refaktoryzacji. – LeffeBrune