Temat: Pytanie

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. Jak byście to rozwiązali architektonicznie – prosto i logicznie? Czy dałoby się przekazywać jakoś data context do tego modułu w taki sposób, żeby go tam obsługiwać. Problem w tym, że ma być on (ten modułu) uniwersalny a przecież z różnych aplikacji będę przekazywał różne data contexty (no i klasa Adresu będzie innego typu). Nie wiem czy jasno się wyraziłem, o co mi chodzi.

konto usunięte

Temat: Pytanie

Łukasz Stychoń:
Czy dałoby się przekazywać jakoś data context do tego modułu w taki sposób, żeby go tam obsługiwać.
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.

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();
}
}

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ń:
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:
jak najbardziej - same DTO i nic więcej (ale dodaj sealed)

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 = true
1. Tworzysz nowe entity (to wygenerowane przez designer Linq2SQL). > Wystarczy odpowiednia projekcja do IEnumerable<TEntity>
2. dc.InsertAllOnSubmit
3. dc.SubmitChanges
Haha :D Jaka numeracja :D

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:
Karim Agha:
Haha :D Jaka numeracja :D

A co, od razu widać, że prawdziwy programista :)
no w każdym razie na pewno w VB/Delphi nie programuję:)

konto usunięte

Temat: Pytanie

maciek kański:
Krzysztof Kozłowski:
Karim Agha:
Haha :D Jaka numeracja :D

A co, od razu widać, że prawdziwy programista :)
no w każdym razie na pewno w VB/Delphi nie programuję:)

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 dobrze
potworki można bowiem tworzyć w dowolnym języku - nieprawdaż?
Eh, kontekstowo chodziło o to czy liczymy od zera czy jedynki jak w VB/Delphi i zapewne innych.
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 dobrze
potworki można bowiem tworzyć w dowolnym języku - nieprawdaż?
Eh, kontekstowo chodziło o to czy liczymy od zera czy jedynki jak w VB/Delphi i zapewne innych.
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.

Michał K. .NET Developer

Temat: Pytanie

Przemysław R.:
potworki można bowiem tworzyć w dowolnym języku - nieprawdaż?
Spróbuj to zrobić w Brainfucku. ;-p

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)?

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 ;)

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

Następna dyskusja:

pytanie do programistów




Wyślij zaproszenie do