Łukasz Stychoń Just me
konto usunięte
Temat: Pytanie
Łukasz Stychoń:Moim zdaniem to czego potrzebujesz to zwykłe repozytorium - abstrakcja w postaci interfejsu z metodami dodaj/usuń/pobierz oraz oddzielne implementacje dla innych struktur. Implementacja sprowadzi się pewno do wrappera, który zadaje query na DataContext i robi projekcję na ustalone obiekty DTO.
Czy dałoby się przekazywać jakoś data context do tego modułu w taki sposób, żeby go tam obsługiwać.
Moje DataContext zawsze oznaczam jako internal (łącznie z wygenerowanymi entity) oraz pamiętam o wywołaniu Dispose; ogólnie lubię Linq2SQL bo zaoszczędzam dzięki niemu wiele czasu, ale mocno go ukrywam i staram się nie przekazywać do świata zewnętrznego.
W DataContext siedzi połączenie do bazy danych - pamiętaj o zamknięciu (czyli Dispose)
Poniżej mój przycięty przykład: tylko metoda Get, z pominięciem kwestii filtrowania oraz sortowania, ale z pagingiem:
public interface IOrderRepository {
IList<DTOOrder> GetOrders(int pageNumber,int pageSize);
}
public sealed class OrderRepository : IDisposable, IOrderRepository {
readonly SomeDataContext dc;
public OrderRepository(string connectionString) {
DataLoadOptions _dlo = new DataLoadOptions();
this.dc = new SomeDataContext(connectionString) {
ObjectTrackingEnabled = false, LoadOptions = _dlo
};
}
void IDisposable.Dispose() {//pamietaj o wywolaniu
dc.Dispose();
}
IList<DTOOrder> IOrderRepository.GetOrders(int pageNumber,int pageSize) {
return dc.someTableValuedSqlFunction("some constant")
.Select(a => new DTOOrder {
OrderId = a.OrderId,
OrderDate = a.OrderDate
})
.Skip((pageNumber-1) * pageSize)
.Take(pageSize) .ToList();
}
}
Łukasz Stychoń Just me
Temat: Pytanie
No chyba właśnie o coś takiego mi chodzi. Ale jeszcze dopytam. Te obiekty DTO to po prostu klasy z właściwościami:
public class DTOOrder
{
public DTOOrder() { }
public int OrderId { get; set; }
public DateTime OrderDate { get; set; }
}
Nie wiem czy dobrze rozumiem ale w momencie zapisu przekazuję sobie do jakiejś metody Insert klasy OrderRepository listę nowo dodanych DTOOrder, po czym ładuję ją do contextu i robie submit?
Jeśli tak to jak rozwiązać update? Co prawda mogę też przekazać do metody liste wszyskich DTOOrder i w pętli nadpisać to co mam w contexcie. Ale to chyba nie jest zbyt eleganckie.
konto usunięte
Temat: Pytanie
Łukasz Stychoń:jak najbardziej - same DTO i nic więcej (ale dodaj sealed)
No chyba właśnie o coś takiego mi chodzi. Ale jeszcze
dopytam. Te obiekty DTO to po prostu klasy z właściwościami:
Co do insertów:
0. Tworzysz DataContext z ObjectTrackingEnabled = true
1. Tworzysz nowe entity (to wygenerowane przez designer Linq2SQL). Wystarczy odpowiednia projekcja do IEnumerable<TEntity>
2. dc.InsertAllOnSubmit
3. dc.SubmitChanges
W razie update zmieniasz punkt 1 na AttachAll oraz dodajesz obsługę błędów 'konkurencji' tj. ChangeConflictException - i to zagadnienie, plus e/w transakcja jest tematem wymagającym głębszej uwagi.
EDIT2:
I robiąc pierwszy raz cokolwiek nowego z Linq2SQL polecam zawsze podglądanie go przez dc.Log lub najlepiej przez profilera na SQL Serverze. Wtedy masz pewność, że to co mapper robi jest tym, czego oczekujesz.maciek kański edytował(a) ten post dnia 15.03.10 o godzinie 14:52
konto usunięte
Temat: Pytanie
0. Tworzysz DataContext z ObjectTrackingEnabled = trueHaha :D Jaka numeracja :D
1. Tworzysz nowe entity (to wygenerowane przez designer Linq2SQL). > Wystarczy odpowiednia projekcja do IEnumerable<TEntity>
2. dc.InsertAllOnSubmit
3. dc.SubmitChanges
konto usunięte
Temat: Pytanie
Karim Agha:
Haha :D Jaka numeracja :D
A co, od razu widać, że prawdziwy programista :)
konto usunięte
Temat: Pytanie
Krzysztof Kozłowski:no w każdym razie na pewno w VB/Delphi nie programuję:)
Karim Agha:
Haha :D Jaka numeracja :D
A co, od razu widać, że prawdziwy programista :)
konto usunięte
Temat: Pytanie
maciek kański:
Krzysztof Kozłowski:no w każdym razie na pewno w VB/Delphi nie programuję:)
Karim Agha:
Haha :D Jaka numeracja :D
A co, od razu widać, że prawdziwy programista :)
nie ważne w czym, grunt żeby robić to dobrze
potworki można bowiem tworzyć w dowolnym języku - nieprawdaż?
konto usunięte
Temat: Pytanie
Łukasz Stychoń:
Hej, mam takie pytanie. Mam jeden moduł w aplikacji, który będzie wykorzystywany także w innych aplikacjach. Jego zadaniem są proste operacje (insert, update) na tabeli zawierającej dane adresowe. Problem w tym, że każda aplikacją ma swoją bazę z własną tabelą (co prawda o zbliżonej strukturze). Chciałbym do tego wykorzystać Linq to sql lub Ado.net entity data model.
A nie lepiej zrobic to tandemem NHibernate + fluent ew. jakis Active Record? IMHO duuuuzo lepsza opcja niz Linq2Sql czy (OMG) Entity Framework.
konto usunięte
Temat: Pytanie
nie ważne w czym, grunt żeby robić to dobrzeEh, kontekstowo chodziło o to czy liczymy od zera czy jedynki jak w VB/Delphi i zapewne innych.
potworki można bowiem tworzyć w dowolnym języku - nieprawdaż?
A nawet jak jakiś język programowania jest badziewny - bo niektóre są - to na pewno taki pogląd nie przenosi się na programistę. Nie uosabiaj się z używanym językiem:)
konto usunięte
Temat: Pytanie
maciek kański:
nie ważne w czym, grunt żeby robić to dobrzeEh, kontekstowo chodziło o to czy liczymy od zera czy jedynki jak w VB/Delphi i zapewne innych.
potworki można bowiem tworzyć w dowolnym języku - nieprawdaż?
A nawet jak jakiś język programowania jest badziewny - bo niektóre są - to na pewno taki pogląd nie przenosi się na programistę. Nie uosabiaj się z używanym językiem:)
język to narzędzie, a przecież nie utożsamiamy się z mlotkiem ;)
osobiście w tym konkretnym temacie pozwolił bym sobie na zrobienie procedury w jakimś T-SQL-u i dopiero coś takiego uruchamiał za pomocą ORM-a
kulawe, koślawe, ale elastyczne moim zdaniem i bez zbędnych udziwnień po obu stronach aplikacji i bazy danych
Michał K. .NET Developer
Temat: Pytanie
Przemysław R.:Spróbuj to zrobić w Brainfucku. ;-p
potworki można bowiem tworzyć w dowolnym języku - nieprawdaż?
Przepraszam za offa, ale nie mogłem się powstrzymać. ;-)
konto usunięte
Temat: Pytanie
maciek kański:
W DataContext siedzi połączenie do bazy danych - pamiętaj o zamknięciu (czyli Dispose)
a tak przy okazji to lepiej w tego typu klasie tworzyć nowy kontekst do bazy i potem go zwalniać czy lepiej tylko przekazać kontekst utworzony wcześniej dla całej aplikacji?
konto usunięte
Temat: Pytanie
Krzysztof Kozłowski:
maciek kański:
W DataContext siedzi połączenie do bazy danych - pamiętaj o zamknięciu (czyli Dispose)
a tak przy okazji to lepiej w tego typu klasie tworzyć nowy kontekst do bazy i potem go zwalniać czy lepiej tylko przekazać kontekst utworzony wcześniej dla całej aplikacji?
Tutaj jest cały artykuł Strahl'a.
http://www.west-wind.com/weblog/posts/246222.aspx
konto usunięte
Temat: Pytanie
Łukasz Stychoń:
Hej, mam takie pytanie. Mam jeden moduł w aplikacji, który będzie wykorzystywany także w innych aplikacjach. Jego zadaniem są proste operacje (insert, update) na tabeli zawierającej dane adresowe. Problem w tym, że każda aplikacją ma swoją bazę z własną tabelą (co prawda o zbliżonej strukturze). Chciałbym do tego wykorzystać Linq to sql lub Ado.net entity data model.
A jak bardzo "inna" jest struktura tabeli? Jak często będziesz dodawał nowe aplikacje z bazami (czy możesz pozwolić sobie na rekompilację kodu za każdym razem)?
Łukasz Stychoń Just me
Temat: Pytanie
Nieznacznie różna, tak jak to może być w tabeli Adresowej (raczej zawrze się w innych nazwach kolumn).Dość często w różnych aplikacjach ten moduł będzie używany, dlatego chcemy zrobić coś, co będzie elastyczne i nie trzeba będzie za każdym razem wymyślać koła od nowa. Pomysł Maćka sprawdza się tu znakomicie.
PS. Jak w Linq to sql zaktualizować entity jakieś tabeli. Powiedzmy, że doszły mi nowe pola, zmieniły się typy pól… Jak te zmiany odzwierciedlić w DataContext? Trzeba usunąć obiekt tej tabeli i dodać od nowa?
konto usunięte
Temat: Pytanie
Łukasz Stychoń:>
PS. Jak w Linq to sql zaktualizować entity jakieś tabeli. Powiedzmy, że doszły mi nowe pola, zmieniły się typy pól… Jak te zmiany odzwierciedlić w DataContext? Trzeba usunąć obiekt tej tabeli i dodać od nowa?
I tutaj jest pies pogrzebany. L2SQL opiera się na pliku dbml, który generowany jest na podstawie struktury bazy danych. Ciężko będzie wykorzystać ten sam kontekst do wyciągania danych z tabeli w innej bazie danych jeżeli struktura tabeli nie jest taka sama (nazwy i typy pól). Podejrzewam, że będziesz musiał się przeprosić z ADO.NET i zacząć ręcznie sklejać komendy SQL lub pojedziesz po bandzie i zrobisz SELECT * FROM ..., a resztę roboty załatwisz odpowiednim object mapperem ;)
Łukasz Stychoń Just me
Temat: Pytanie
Ale nie będę wykorzystywał tego samego kontekstu do innych baz. Robię tak jak poradził Maciek - projekcję obiektu tabeli Adresy na wspólny obiekt Adres.Natomiast w tym ostatnim pytaniu chodziło mi o to czy, jeżeli zrobię sobie taki plik .dbml a coś mi się zmieni w tabeli w bazie na której ten plik jest oparty to czy mogę go sobie jakoś łatwo zaktualizować. Entity Model ma w designerze taką opcje pod prawym klawiszem – aktualizującą model na podstawie bazy danych.
konto usunięte
Temat: Pytanie
Odświeżanie dbmla nie istnieje (przynajmniej za darmo). Musisz to zrobić ręcznie (usuń, dodaj obiekt). Innym rozwiązaniem (płatnym) jest:http://www.huagati.com/dbmltools/
lub
http://www.llblgen.com/defaultgeneric.aspx + templatey do L2SQL
Podobne tematy
-
Programiści .NET » pytanie do programistów -
-
Programiści .NET » pytanie odnosnie ASP.NET MVC i web.config -
-
Programiści .NET » Pytanie na temat zachowania kontrolki DataGridView -
-
Programiści .NET » Sprzęt jakiego używacie podczas programowania. Troszkę... -
-
Programiści .NET » Pytanie do specjalistów od WinForm -
-
Programiści .NET » Kompilacja pytanie -
-
Programiści .NET » Kolejne pytanie o MVVM. Błędy przy budowaniu. -
-
Programiści .NET » Linq - pytanie -
Następna dyskusja: