WPROWADZENIE Do ENTITY FRAMEWORK CORE – Współpraca z Bazą Danych w C#

Cześć! Jest już nowy odcinek na kanale modestprogrammer na youtube. Dowiesz się z niego, jak współpracować z bazą danych C#. Opowiem o tym, czym jest ORM oraz przede wszystkim Entity Framework i Entity Framework Core. Miłego oglądania

Link: https://www.youtube.com/watch?v=p0KeZqlPq7I

#programowanie #programista #nauka #naukaprogramowania #programista15k #csharp #dotnet #entityframework
Pobierz kazik- - WPROWADZENIE Do ENTITY FRAMEWORK CORE – Współpraca z Bazą Danych w C#

Cze...
źródło: comment_16263553380fpgm5thSkICfcGHITmTb7.jpg
Cześć Mirki,
od jakiegoś czasu tworzę podcast Backend na Froncie, w którym rozmawiam z gośćmi na tematy programistyczne (zwykle około .NETowe)
Dzisiaj pojawił się odcinek numer 6, w którym razem z Michałem Białeckim odpowiemy na pytanie Dlaczego używamy Entity Framework?

Rozmawialiśmy o tym:
Co to jest orm
Entity Framework czy EF Core
Czy EF Core to jedyna opcja? Jakie są inne współpracujące z .net?
Dlaczego potrzebujemy migracji?
Jak pisać dobre migracje?
Czy
Pytanie dotyczące EF i trochę #bazydanych od nooba. Podejście code first

Powiedzmy, że tworzę sobie model User, który ma id, nazwę, hasło itp i do tego ma kolekcje zwierząt (klasa Animal). Animal ma w sobie id, Guid, nazwę, obiekt typu Type. Da się jakoś mądrze zrobić, żeby Type był automatycznie dopasowany 'kolumnami' do odpowiedniego typu? Rozumiem, że dla każdego typu zwierzęcia i tak muszę zrobić tabelę, ale chodzi mi o coś takiego:
@g_vv: Nikomu się nie chce z tym bawić, ale jak mus, to mus.
Ale nie narzekaj - obecnie jestem w projekcie pisanym od podstaw w dotnet core, ale korzystamy z bazy na Oracle. Zwykle użylibyśmy Dappera czy jakiegoś innego mini-ORMa, ale musimy się jeszcze zintegrować z "odziedziczonym" serwerem, przez który wszystkie inserty, update'y itd muszą przechodzić. Dlatego musimy kombinować z własnym "ORMem" i męczyć się z tym serwerem...
Samo "DB First"
Teraz już nie będę usuwać postów, obiecuję. Mirki mam problem z Entity Framework. Tworzę sobie ADO.NET model i niestety nie generuje mi poprawnie pliku BlogModel.Designer.cs - plik ten jest pusty. Na razie jedyne rozwiązanie jakie znalazłem to kliknięcie PPM na diagram i wybranie opcji "Add Code Generation Item...".

Gdy wpiszę jakąś nazwę to powstaje poprawny plik designera, ale jako że się uczę - nie wiem czy ten plik jest jakoś powiązany z
@thomekh:
Co masz na myśli przez "w ten sposób"? Ogólnie to ja się skupię na Code First, chcę po prostu ogólnie skrobnąć wszystkie po trochu z EF. Właściwie twierdzisz, że nie warto się uczyć EF, ale w ofertach na juniora bardzo często się pojawia. Tylko dlatego się tego uczę.

@drajvver
Tak wiem Code First ftw. Tego się będę najbardziej uczyć :)
@30012016: Timestamp to nie jest typ związany z datą/czasem. Pewnie w EF modelu masz TimeSpan i on jest mapowany na sqlowy typ Time. Co do wydajności ciężko powiedzieć bez Execution plan i określeniem ile danych będzie produkcyjne. W EF core tez możesz indeksy zrobić, za pomocą migracji. Ogólnie jeśli nie znasz SQLa to wybierz inny data storage. ORM to rozwiazanie, które nie na przykryć nieznajomości technologii, tylko przyspieszyć budowanie aplikacji developerom,
@30012016: Wybacz, nie wiem czemu, pomyślałem, ze mówisz o mssql. Uwaga o timestamp w takim razie nieaktualna. Indeks tylko przyspieszy wyszukiwanie, Ty sam do niego się nie odwołujesz. Bez indeksu silnik będzie robił table scana, ale w aplikacji do portfolio może to nie mieć aż tak dużego znaczenia. W ostateczności: jeździć obserwować. Jak zauważysz z czasem, ze to zapytanie trwa długo, albo zabiera za dużo zasobów, to dodasz indeks na bazie.
#aspnet #bazydanych #csharp #dotnet #entityframework #postgresql #sql

Próbuję podpiąć PostgreSQL zamiast Microsoft SQL Server. W pgAdmin doinstalowałem rozszerzenie citext. Zmieniłem kolumnę na citext. Do DbContext dodałem HasPostgresExtension("citext"). Pokasowałem migracje, dodałem nową. Mimo tego takie zapytania nie ignorują wielkości liter:

Where(u => u.UserName == userName)
Poniższe oczywiście działa:

Where(u => u.UserName.ToLower() == userName.ToLower())
Chciałbym uniknąć takich mało eleganckich fixów specjalnie dla jednego dostawcy bazy.
#aspnet #csharp #dotnet #entityframework

Czy zwracanie modeli widoku z repozytorium to zła praktyka? Powinienem dodać jakąś warstwę między repozytorium a kontrolerem?

Czy posiadanie dużej ilości metod w repozytorium to zła praktyka? Powinienem rozdzielić repozytorium na kilka innych? Czy może poprzerabiać metody na uogólnione lub przyjmujące argument delegatu?
@30012016: Zależne od kilku czynników, ale mając do wyboru kilkadziesiąt wycieczek do bazy albo jedną (zakładam, że to jakaś prosta kwerenda), nie musisz spychać tego na bazę i lepiej pobrać raz do pamięci i mielić lokalnie. Jeśli za każdym razem w pętli będziesz wołał np. SingleOrDefault() na DBSecie, będziesz za każdym razem leciał z kwerendą do bazuki.
Jak zmapować w Entity Framework Core więcej niż jedną relację wiele-do-wielu? Na przykład, żeby użytkownik mógł polubić wiadomość i/lub oznaczyć jako ulubioną?

public class User
{
public int Id { get; set; }
public ICollection LikedPosts { get; set; }
public ICollection FavoritedPosts { get; set; }
}
public class Post
{
public int Id { get; set; }
public ICollection UsersThatLike { get; set; }
public ICollection UsersThatFavorite { get; set;
Mam pytanie co do entity frameworka. Załóżmy że mam model User który ma relacje jeden do wielu z modelem Book (user może mieć wiele książek). Czy będzie jakaś różnica jeżeli w modelu user zrobię listę typu book (z tego co widziałem w bazie entity i tak tworzy wtedy FK w tabeli book do danego usera) lub jeżeli sam zdefiniuje klucz obcy w modelu book do usera? Jeżeli będę później chciał z bazy
@sf71hrb6: Dokładnie tak jak napisał @kubsle
Ta referencja do List to navigation property, a używanie Include to tak zwany Eager Loading.

Rozwiązanie pierwsze w sumie można zastosować jednocześnie z drugim i przydaje się w sytuacji gdy masz encję dziecko i potrzebujesz tylko id parenta.

Przykład relacji Project ma wiele Section:

Project.cs

public ICollection Sections { get; set; } = new Collection();
Section.cs

[ForeignKey(nameof(ProjectId))]
public Project Project { get; set; }
public
dokładnie tak jak wspomniał @bacteria, najpierw zadeklarowałeś nazwę tabeli która przyjmuje wartość FK, a poniżej deklarujesz tabele z która ma być połączony.( ͡° ͜ʖ ͡°)
Aby to było bardziej czytelne najpierw powinna być tabela z która łączysz a potem powinna być nazwa kolumny,( ͡° ͜ʖ ͡°)( ͡° ͜ʖ ͡°)
via Wykop Mobilny (Android)
  • 0
Jak robię zapytanie do bazy, a w zasadzie do widoku w bazie przy pomocy Linq przez ORM, to to zapytanie dociąga wszystkie rekordy z widoku i dopiero potem wykonuje się query czy query jest jakoś bardziej zoptymalizowane?

Sorry za składnie. Późno jest.

#entityframework #csharp