2009-08-24 13 views
6

mam rozwiązanie .NET zawierający dwa projekty:Dwa projekty .NET, jeden ciąg połączenia DB?

    projekt
  • ASP.NET MVC, 'WWW'
  • Biblioteka klasy,

Projekt "modelek 'modele' Zawiera kontekst danych Linq-SQL, wraz z kilkoma klasami częściowymi, które rozszerzają obiekty bazy danych.

Ciąg połączenia jest zdefiniowany w web.config projektu "Witryna".

Jednak projekt "Modele" wydaje się mieć własny app.config, gdzie połączenie z bazą danych jest zdefiniowane osobno.

Oznacza to, że jeśli ciąg połączenia ulegnie zmianie, będę musiał zaktualizować oba projekty.

Czy istnieje sposób, aby scentralizować ciąg połączenia w jednym miejscu i nadal korzystać z niego w obu projektach?

Odpowiedz

4

Utwórz klasę częściową, która jest taka sama jak kontekst danych i użyj tego kodu, aby wymusić użycie ciągu web.config w przeciwieństwie do pliku app.config. Umieść klasę częściową w tej samej lokalizacji co model w bibliotece klas.

public partial class YourDataContext 
{ 
    partial void OnCreated() 
    { 
     ConnectionStringSettings cs = ConfigurationManager.ConnectionStrings["PrimaryConnectionString"]; 

     if (cs != null) 
     { 
      this.Connection.ConnectionString = cs.ConnectionString; 
     } 
    } 
} 

Zobacz to pytanie, aby uzyskać więcej informacji Preferred Method for connection string in class library
RichardOD napisali link co myślę najlepiej opisuje nasz problem LINQ To SQL and the Web.Config ConnectionString Value

+0

Do czego służy głosowanie na dół? – Breadtruck

+2

Ale jak to będzie działać, ponieważ klasy cząstkowe muszą należeć do tego samego zgromadzenia? Chcę, aby zestaw "Modele" użył ciągu połączenia z pliku web.config w zespole "Witryna". – Jonathan

+0

BTW, nie zrobiłem żadnego zaniedbania. – Jonathan

1

Powiedziałbym, że powinieneś zachować konfigurację produktu w web.config projektu WWW, a następnie wprowadzić konfigurację, której używasz do projektu modelu.

+0

To co robię. Zobacz moją odpowiedź dla rzeczywistego przykładu kodu – Breadtruck

2

W porządku. Umieść łańcuch połączenia modelu w pliku Web.config i zapomnij (usuń) plik konfiguracyjny modelu.

DataContext trwa również w ciągu połączenia w jego konstruktora tak można określić to w ten sposób też (być może nie w jednej linii chociaż):

DataContext context = new DataContext(ConfigurationManager.ConnectionStrings["TheKey"].ConnectionString); 

Edycja- oparciu o komentarze do innych odpowiedzi to wygląda tak jak robisz coś złego. Jeśli to robisz, wygenerowany kod użyje domyślnej wartości ustawienia.

System.Configuration.DefaultSettingValueAttribute("Data Source=SERVER;Initial Catalog=XYZ;Integrated Security=True")]. 

Możecie być dokonywania błąd not specifying the connection string properly w pliku Web.config.

+0

@RichardOD: Komentuję, ale tak naprawdę nie zadałem tego pytania, chociaż poprosiłem o jedno podobne do tego czasu. Nigdy nie próbowałem po prostu usunąć pliku appconfig. Moja ciotka to zasugerowała, ale w projekcie miałem także kilka modeli zbiorów danych, w tym przypadku musisz utworzyć wiele klas częściowych tabel, a ja nie zamierzałem tego zrobić, więc nie próbowałem usunąć aplikacji. config, ale wyobrażam sobie, że to zadziała. – Breadtruck

0

OK, zgaduję, ale wygląda na to, że oba projekty używają identycznego ciągu połączenia, tak?

W takim przypadku należy podać tylko ciąg połączenia w pliku web.config; biblioteka klasy app.config i tak nie zostanie odczytana przez ASP.NET.

+0

To nie było moje doświadczenie, chyba że coś źle skonfigurowałem. – Breadtruck

+0

Naprawdę? Czy korzystasz z komponentu innego producenta, który robi to za Ciebie? Ponieważ z mojego doświadczenia wynika, że ​​tylko plik app.config dla pliku wykonywalnego (lub w przypadku programu ASP.NET web.config) jest domyślnie odczytywany przez system. Jeśli plik app.config jest powiązany z biblioteką klasy (.DLL), zawartość tego pliku app.config musi być A) załadowana ręcznie (czyli jakie komponenty strony trzeciej wykonują to dla ciebie) lub B) skopiowana do app.config/web.config głównej aplikacji. – Randolpho

+0

@Randolpho: Zobacz http://stackoverflow.com/questions/1148559 po więcej wyjaśnień dotyczących mnie. – Breadtruck

0

Myślę, że ciąg połączenia w bibliotece modeli jest właśnie używany przez projektanta. W czasie wykonywania łańcuch jest ładowany z pliku web.config. Więc niekoniecznie musisz synchronizować łańcuchy.

+0

To nie jest to, co znalazłem po wdrożeniu takiego rozwiązania do produkcji. Biblioteka kontynuowała pobieranie połączenia z pliku app.config. – Breadtruck

0

Nie trzeba app.config biblioteki klas. Po prostu ustaw swoją konfigurację na web.config. Ponadto, jeśli potrzebujesz sekcji konfiguracji z aplikacji biblioteki.config, po prostu umieść go na web.config. Menedżer konfiguracji odczyta go stamtąd.

0

Jeśli biblioteka klas modeli jest przywoływana w aplikacji internetowej, można po prostu usunąć odwołanie z pliku App.Config i upewnić się, że jest ona podobna do tej umieszczonej w sieci. config. W ten sposób, gdy kompilator zajrzy do pliku web.config, znajdzie ciąg połączenia potrzebny do projektu MVC, a zatem nie będzie musiał szukać go w dół.

+0

Próbowałem tego, ale wydaje się, że otrzymuję ciąg połączenia z pliku "Ustawienia" pod właściwościami projektu Models. W klasie jest taki kod: 'global :: Models.Properties.Settings.Default.WebConnectionString, mappingSource)' – Jonathan

+0

@jonathanconroy: właśnie dlatego moja odpowiedź pomoże ci ominąć ten problem. – Breadtruck

0

Osobiście przedłużyć DataContext w moim Respository następnie zrobić coś takiego:

public ContractsControlRepository() 
     : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { } 

tamtędy mój repozytorium może być instancja i nigdy nie martwić się o ustanowienie połączenia, czy mając do czynienia z nim w ogóle. Aby zmienić na/z dev/live database po prostu zmienię mój web.config.

0

Plik app.config w bibliotece nie wpłynie na produkcję - te ciągi połączeń naprawdę istnieją dla projektanta linq2sql. Nic do zobaczenia, posuwaj się dalej, to nie są droidy, których szukamy. . .

Powiązane problemy