Połączenie z bazą dwóch aplikacji oraz sens ORM

1

Witam, nie wiem czy nie powinienem tego napisać w Newbie, w razie potrzeby proszę o przeniesienie.

Piszę pracę inżynierską i zdecydowałem się napisać to w C#. W Javie piszę o początku studiów, stwierdziłem, że spróbuję .NET. Chcę napisać dwie aplikacje, jedna WPF, druga ASP NET MVC. Strona ASP będzie korzystała z danych generowanych i modofyikowanych w programie WPF, a także sama będzie mogła generować nowe dane, z których z kolei będzie korzystać aplikacja WPF. Generalnie chodzi mi o to, jak to połączyć. Silnik bazy to MSSQL. Myślałem nad dwoma bazami danych, jedna lokalnie w powiedzmy docelowej firmie, gdzie będzie na stanowiskach aplikacja WPF, a druga z tej głównej na serwerze www. Obie bazy zlinkowane. Na obu triggery, które wykonują odpowiednie operację na zdalnej bazie. Druga opcja to jedna baza. Dostęp z aplikacji www do danych przez webservice z aplikacji na serwerze, czyli dojdzie kolejna aplikacja. Może są jakieś inne opcje?

Drugie pytanie to ORM, w ogóle sens jego użycia. Zastanawiam się nad użyciem EF, ewentualnie samemu napisać repozytoria. Moje wątpliwości co do wykorzystania to m.in to, że konfiguracja bazy będzie przy pierwszym uruchomieniu programu, gdzie oczywiście użytkownik wprowadza np. dane firmy, ustawienia początkowe aplikacji, po uzupełnieniu danych, stworzona zostanie struktura bazy na podanym serwerze oraz wprowadzone dane początkowe, że tak powiem do odpowiednich tabel. I teraz może dla niektórych wydać się głupie pytanie... W Entity Framework przy sposobie CodeFirst, baza jest tworzona na etapie kompilacji, czy uruchomienia programu?

W razie pytań odpowiem, ewentualnie rozwinę jakąś cześć, nie chciałem za bardzo się rozpisywać...
Pozdrawiam.

0

Po co ci dwie bazy danych ? Wystarczy w zupełności jedna z, której będą korzystać aplikacje w WPF i ASP.NET. Właśnie chodzi o to w bazie danych by był do niej dostęp z różnych urządzeń: desktop, serwisy internetowe, aplikacje mobilne. Idiotyzmem jest robić dwie osobne bazy danych, i je następnie scalać. Generalnie możesz rożnie do tego podejść w sprawie jak napisać obsługę tych baz danych. I tutaj raczej zależy do tego co chcesz robić z danymi jak je przechowywać, prezentować. Generalnie jak po stronie ASP napiszesz API to możesz o te api oprzeć aplikację napisaną w WPF a przy okazji pisanie aplikacji mobilnej pod to API powinno pójść też o wiele łatwiej bo wówczas uzyskujesz z poziomu serwera dostęp do baz danych.

Co do ORM ciężko mi się wypowiedzieć bo nie korzystałem wcześniej. Generalnie sporo wielkich projektów nie używa ORM bo czasem są mało wydajne więc nawet korzystając z nich, w niektórych miejscach pisze się samemu zapytania by je przyspieszyć. Na pewno jest to ciekawe doświadczenie tym bardziej, że ORM bardzo często przewija się przez oferty pracy :). Powodzenia w pisaniu inżynierki :D

0

Niepotrzebna ta ironia na końcu, mam jeszcze rok, pytania może naiwne i głupie, chcę się po prostu zorientować wcześniej, jak stwierdzę, że nie dam rady, to zrobię to w Javie i całość zrobię w Springu. Póki co jestem mocno "nakręcony" na .NET.

Co do tematu dwóch baz. Owszem nie ma problemu w zrobieniu połączenia do jednej bazy. Ale chciałbym zrobić, że tak powiem rozdzielenie pomiędzy serwerem www dostępnym dla "świata", a serwerem bazy danych dla bazy firmowej, który stoi lokalnie w organizacji bez dostępu z zewnątrz. Może głupie rozwiązanie, na razie jestem na etapie planowania.

Co do ORMa. Robiłem aplikacje bez ORM, jak również z Hibernate. W sumie moje wątpliwości nie opierają się problemach wydajnościowych, gdyż mój projekt nie będzie należał do tych wielkich. Bardziej chodzi mi o te rzeczy, które ORM narzuca.

1

Pomysł z uzyciem dwóch baz danych wcale nie jest taki głupi, jedna lokalnie w razie braku dostepu do internetu, a druga globalnie gdzieś tam w internecie. Głupotą jest natomiast pomysł synchronizowania ich za pomocą trigerów. Ogólnie sam ten problem synchronizacji i działania aplikacji na dwóch bazach, jest sam w sobie ciekawym i wcale nie łatwym tematem na pracę dyplomową.

2
lukaszek016 napisał(a):

Niepotrzebna ta ironia na końcu, mam jeszcze rok, pytania może naiwne i głupie, chcę się po prostu zorientować wcześniej, jak stwierdzę, że nie dam rady, to zrobię to w Javie i całość zrobię w Springu. Póki co jestem mocno "nakręcony" na .NET.

No i tego się trzymaj, zawsze warto spróbować czegoś nowego. Poza tym .Net jest świetny do takich zadań (nie twierdzę że Java ze Springiem nie jest).

Co do tematu dwóch baz. Owszem nie ma problemu w zrobieniu połączenia do jednej bazy. Ale chciałbym zrobić, że tak powiem rozdzielenie pomiędzy serwerem www dostępnym dla "świata", a serwerem bazy danych dla bazy firmowej, który stoi lokalnie w organizacji bez dostępu z zewnątrz. Może głupie rozwiązanie, na razie jestem na etapie planowania.

Ale koniec końców i tak będziesz musiał to jakoś zintegrować więc tylko niepotrzebnie dołożysz sobie utrudnień. Mając osobną bazę danych dla każdego systemu cofasz się tak naprawdę do starego modelu przechowywania danych- no chyba że zaimplementujesz mikroserwisy i architekturę CQRS ale to już całkowicie inna bajka.

Co do ORM to nie wiem skąd wątpliwości- jak najbardziej warto je używać. Nie wiem skąd w dzisiejszych czasach zła opinia o szybkości ich działania- chyba niektórzy mentalnie utknęli w poprzedniej dekadzie. Pracowałem przy systemach finansowych które za krytyczny wymóg miały szybkość przetwarzania danych i nadal korzystały z ORM- tak, również Entity Framework (zaraz ktoś tutaj przyjdzie i będzie wylewał pomyje twierdząc że to zUo). Oczywiście znajdą się przypadki w których ORM faktycznie będzie za wolny i trzeba się posiłkować czystym ADO albo ewentualnie Dapper'em ale są to wyjątki których jest ułamek.

W Entity Framework przy sposobie CodeFirst, baza jest tworzona na etapie kompilacji, czy uruchomienia programu?

W trakcie uruchomienia programu. Ale ogólnie to na bazie produkcyjnej lepiej samemu ją aktualizować.

Innymi słowy postaw jedną bazę, użyj EF, NHibernate czy co tam chcesz i ciesz się życiem :)

0

Czy zamierzasz dać aplikacji ASP i aplikacji WPF bezpośredni dostęp do tej bazy ? Jeśli tak to raczej jest to błąd bo wtedy masz elementy logiki biznasowej po stronie aplikacji klienckich które takiej mieć nie powinny mieć albo wcale albo mieć tylko w stopniu wymaganym do prezentacji. Rozważ budowę WebAPI którego będziesz używał poprzez WPF i ASP.NET

0

Aventus, fakt, temat dwóch baz mocno do przemyślenia, raczej zrezygnuję z tego pomysłu.

Co do ORM. Pisząc w Springu, konfiguracja połączenia z bazą, była w pliku properties, kiedy bazy nie było to całą struktura była generowana na podstawie modelu i adnotacji.
Tutaj chcę tego uniknąć.
Miałoby to wyglądać tak, że przy pierwszym uruchomieniu użytkownik podaje dane logowania do bazy. Program sprawdza, czy baza jest na podanym serwerze, jeśli nie to po podaniu w kolejnym oknie wymaganych danych, np. dane firmy, format wydruku raportów, format wydruku etykiet, wybór domyślnych drukarek program utworzy bazę danych z odpowiednio uzupełnioną tabelą z ustawieniami.
Oczywiście przy podłączaniu do istniejącej bazy, chciałbym, aby program wykonał testy integralności odpalając zdefiniowane funkcje na serwerze.

Czy da się to zrobić w EF? Nie oczekuję odpowiedzi jak, tylko czy.

Jedyne czego oczekuję od ORMa to mapowanie, cała konfiguracja bazy i zarządzanie strukturą należy do mnie.

W2F, rozważę, ale co masz na myśli pisząc, że logikę mam w aplikacji? Jakbym używał tylko aplikacji WPF to co by to zmieniło?

2

W EF możesz wybrać podejście Database First, gdzie klasy i ich zależności są generowane na podstawie istniejącej już bazy danych. Natomiast jeśli chcesz mieć pełną kontrolę nad konfiguracją bez żadnych ograniczeń narzuconych przez ORM (jakikolwiek) i zależy Ci tylko na zautomatyzowaniu mapowania to rozważ skorzystanie z Dapper .

Co do konfiguracji to pamiętaj że EF (podejrzewam że NHibernate również) jest bardzo elastyczne.

0

No właśnie, bazę chcę zrobić samodzielnie, również klasy chcę napisać samodzielnie.

Przejrzę dokumentację tego Dappera, dzięki za pomoc!

1

Chodzi o to że podobne zadania edycji/dodawania masz zarówno po stronie aplikacji ASP.NET jak i aplikacji WPF. Pisząc hipotetycznie - jeśli obaj łaczą się bezpośrednio do bazy to jak zagwarantować że logika dodawania nowych elementów do bazy jest spójna po strinie ASP.NET i WPF. A co jeśli w jednej np w aplikacji zmieni się sposób dodawania(nowe nie-nullowalne pola w bazie) elementu, a użytkownik będzie miał starą wersję klienta ?

Rzezywiście w tej sytuacji robienie osbnego api może byc przerostem formy. Natomiast aplikacja WPF pod żadnym pozorem nie powinna miec bezpośrednio dostępu do bazy. Wtedy aplikacja ASP.NET powinna wystawiać API do którego może łączyć sie aplikacja WPF.

1 użytkowników online, w tym zalogowanych: 0, gości: 1