[Databases] Домашно Entity Framework - 2-5 Задачи


8

2 Задача: Create a DAO class with static methods which provide functionality for inserting, modifying and deleting customers. Write a testing class.

http://pastebin.com/w4gYtAJA

В Add метода си добавям само name и id тъй като само те не може да са ми null. Създал съм си един метод, който ми проверява дали това, което се опитвам да вкарам в базата вече го няма и ако го няма го добавям иначе хвърлям изключение.
За другите два метода нещата са аналогични.

3 Задача: Write a method that finds all customers who have orders made in 1997 and shipped to Canada.

http://pastebin.com/iF6yKNt0

Реализирал съм я чрез LINQ Query.
И после с foreach обхождам поръчките, които отговарят на дадените условия. Печатам на конзолата Customer Contact Name и CustomerID, за да съм сигурен, че работи правилно.

4 Задача: Implement previous by using native SQL query and executing it through the DbContext.

http://pastebin.com/SpmHtYkw

Подавам стандартна SQL заявка, след това подавам параметризирани данни и foreach-вам и отпечатвам.

5 Задача: Write a method that finds all the sales by specified region and period (start / end dates).

http://pastebin.com/jT9VfhWG

Не знам вие как разбирате тази задача. Аз прерових всички таблици да търся колона Sales, но ми се струва, че няма. Затова реших, че продажбите са ми количеството продадени неща от дадена поръчка с определен OrderID.
След това си join-вам таблиците и си създавам селекция. После с foreach обхождам.
-------------------------

Някой ако има забележки и препоръки за подобряване на бързината да казва, защото това ми се струва доста бавно.

Някой има ли идея как това order.OrderDate.Value.Year да не връша int, a да връща DateTime :D ?




Отговори



6

Здравей отностно въпроса ти  се сещам само за този вариант: 
new DateTime(o.OrderDate.Value.Year,o.OrderDate.Value.Month, o.OrderDate.Value.Day)
или просто
o.OrderDate.Value.Date

 

Приветствам идеята да се качват решените задачи, макар и от непълна домашна, защото човек има от къде да погледне когато започва отначало. Споделям и аз моите решения до 5та задача, като трета съм я решил с ламбда и линкю(поправете ме ако греша). Останалите после...

Dao.cs   -  3,4,5иMain()


от zhelyazkovn (2949 точки)


0
Имам въпрос:
Какъв е най-добрия вариант за дефиниране на NORTHWNDEntities инстанцията - както при теб като статичен field, който методите след това да си ползват, или както при останалите колеги - във всеки метод нова инстанция?

от nickeyz (878 точки)

0
Мисля, че е по-добре контекстът да се подава като параметър на класа и всички методи да го ползват. using(...) по-добре да се ползва в класа, който извиква DAO методите, тъй като те могат да се викат многократно (а това DAO класа няма как да знае) и няма смисъл при всяка заявка да отваряме и затваряме контекста. DAO методите просто вършат работата, а този, който ги използва се грижи да прихваща Exception-и и да dispose-ва ресурсите.

от vic.alexiev (2299 точки)



5

Решения 1-5

 

Здравейте, поствам решение на задачите до пета включително. Сигурен съм, че има и по-добри и конструктивни решения, затова споделяйте :)

Пламене, след като сравняваш годината с int въведен от потребителя е добре по този начин. И все пак може да опиташ:

cast(my_integer_date as datetime)


от Dimov (907 точки)


0

Да не пускам тема само да спомена, ако някой има проблем със стартирането на демото от лекцията. Има грешка в "Connection string"-а .Има едно пропуснато "I"    - ето така  "catalog=NORTHWND "- а трябва да е  "catalog=NORTHWIND ".

Оправя се като се промени във всеки проект app.Config файла - и намерите в connection string-а къде е това. :)


от boncho.vylkov (1923 точки)


0
При мен базата се казва Northwnd, така че зависи как ти е записана базата.

от VGeorgiev (2890 точки)

0
И при мен беше като при Владо.

от plamen.yovchev (3283 точки)


4

Относно продажбите. Не всяка поръчка означава продажба. Процедурите и view-тата от northwind също са в нашия модел. Имаме процедура [dbo].[Sales by Year], която се е превърнала в метода Sales_by_Year. Тя връща ObjectResult<Sales_by_Year_Result>. Бихме могли да филтрираме нейния резултат по регион (join с таблицата Orders по OrderID). Примерно

var salesByRegionAndYear =
      from salesByYear in northwind.Sales_by_Year(beginningDate, endingDate)
      join order in northwind.Orders
              .Where(o => o.ShipRegion == shipRegion)
      on salesByYear.OrderID equals order.OrderID
      select salesByYear;
 
(beginningDate, endingDate и shipRegion са параметрите на метода.)

от vic.alexiev (2299 точки)


0
тази процедура рови пак в Оrders и не виждам да взима нещо специално предвид дали е продадено нещо или е просто поръчано ;) Единствено, че тя рови в ShippedDate, но това е въпрос на бизнес логика къде ще се зачисли дадена продажба ;)

от vlad0 (6103 точки)


2
6-та задача как я рабирате - да направим само структурата или структурата заедно със съдържанието?



0
Аз съм направил само структурата.

от kirov (4821 точки)

0
Да и аз така направих в края на краищата.



2
И аз нещо на задачката с копирането на базата данни зациклих. Намерих някакъв вариант на създаване на база с "code first", ако се не лъжа. Но не ми я прикача към sql сървъра. Четох , че ако нямаш msql express се създавала автоматично на localhost-a. И в момента я отварям само през VS Server explorer. Това дали е коректно изпълнение на задачката?

от tankovski (2828 точки)


0
Аз я направих следвайки стъпките от този линк http://blogs.msdn.com/b/adonet/archive/2011/09/28/ef-4-2-model-amp-database-first-walkthrough.aspx като на стъпка две направо си вмъкнах .edmx модела на Northwind.



3

Ако някой се затруднява с 6-та задача, това е кодът за генерирането на схемата на базата:

http://pastebin.com/fbje5f4x


от GeorgiYolovski (1147 точки)


6

Всички задачи -> Github

Шеста задача е малко по-специфична. Има няколко начина, по който да се направи, аз съм избрал само чрез код, не през Generate script oт диаграмата(В *.edmx файла можете да кликнете с дясно копче и после да изберете "Generate Database From Model", което ще ви генерира DDL скрипта).

Голямо ровене падна за тази част:


IObjectContextAdapter context = new NorthwindEntities();
string cloneNorthwind = context.ObjectContext.CreateDatabaseScript();

Тя генерира скрипт от модела, който после ще импортнем в базата.

Първо създавам базата с заявка и после се връзваме към новосъздадената база и импортваме генерирания скрипт.

За осма задача измислихме само как ще стане с partial клас. Този клас се намира в 00. проекта - цък

Store процедурата за десета задача - цък 

Базата за единадесета задача - цък


от kirov (4821 точки)


0
Качих всички задачи.

от kirov (4821 точки)

0
А за седма задача, успяхте ли да преминете на pessimistic concurrency и ако да как? По същия начин съм имплементирала дотук, искам да сетна стойност Customer.City, като на пропърти с име "City"съм му добавила ConcurrencyMode="Fixed" , но не се получава.

от linach (717 точки)



0
На никой ли не му хвърля Foreign key exception при изтриване на customer от базата данни?

от vlad_karamfilov (4595 точки)


0
Излиза. С .Remove() има exception, а .DeleteObject() няма от 4.0 насам доколкото разбрах. Не намерих нищо, което да замества стария Delete. В stack имаше постнат метод, който заобикаля донякъде проблема, но не достатъчно.. Колко хубаво беше да си дропваме и вдигаме constraint-ите с transact :D

от spareva (1375 точки)

0
В SQL Server Management Studio може да отидеш на constraint-а, който гърми (примерно FK_Order_Details_Products), десен бутон Modify и на опцията "Enforce Foreign Key Constraint" да дадеш "No". Друг вариант е да drop-ваш constraint-а преди да мажеш :-) и после пак да го създаваш (ако искаш да го автоматизираш през VS или през скрипт).

от vic.alexiev (2299 точки)


3

Задачите от 1 до 5

Когато писах unit test-овете за втора задача се появи конкурентност, затова използвайте различни ID-та на елементите във всеки тест. Когато е едно и също винаги някой тест фейлва.


от georgi.ivanov (3261 точки)


0
Добавена е 10 задача.

от georgi.ivanov (3261 точки)