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




Отговори



0
Не намерих тема за следващите задачи от домашното, затова ще питам тук.
Някои успя ли да си направи транзакция? Аз пробвах с TransactionScope, но при нормално използване всеки път получавам при опит да извикам scope.Complete(); exception, гласящ The underlying provider failed to open.
Четох из StackOverflow, че може би трябвало ръчно да се отваря конекцията с базата преди всяка операция, само дето създадения от мен с уизърда NorthwindEntities контекст не предлага такава опция (и не знам как да си достъпя ръчно самата връзка през C# код).

от petarpenev (3148 точки)


0
Доколкото разбрах EF by default работи в transaction mode, т.е. изпълняваш група команди (batch) и накрая, когато напишеш SaveChanges(), ако някъде нещо се счупи, целият batch се rollback-ва. Така че не е нужен допълнителен код. Е, някой с опит в EF също може да сподели мнение.
Всъщност така се получи в 11 задача - опитах се да вкарам съществуващ user (дублирам Username, за който има unique constraint), като предварително създавам Admins групата (в същата транзакция). Заради Exception-а при добавяне на user, и групата не се създаде.

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

0
Да, това и аз го видях, и моите тестове не счупиха базата, обаче ми влезе мухата в главата да разбера защо това не работи.
Утре на лекциите ще поразпитам.

от petarpenev (3148 точки)



1

Някой може ли да разясни условието на 8ма задача, че не разбирам какво точно се иска?

"8.By inheriting the Employee entity class create a class which allows employees to access their corresponding territories as property of type EntitySet<T>."

от stann1 (1378 точки)


0
Колегите от миналата година имат няколко предложения:
http://forums.academy.telerik.com/8016/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0-8-entity-framework
Това на Маджаров ми изглежда OK.

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

0
Добре де, а откъде идва тази структура EntitySet?

от stann1 (1378 точки)



1
Всички задачи от Entity
https://github.com/Gerya/TelerikAcademy/tree/master/HomeWorks/Databases/06.%20EntityFramework

от Gerya (1079 точки)


3

Всички задачи: тук

6-та задача съм я направил като променя connection string-а на catalog=NorthwindTwin. След това от контекста мога да изплозвам Database.CreateIfNotExists(), което създава новата база от модела.

Едит: 8-ма задача е оправена и е добавено демо. Оказа се, че всички partial класове трябва да са в един проект, за да може да се билднат до общ клас.


от nikostov (202 точки)


0
година идея на 6-та. В 8-ма имаш правописна грешка в get-а на EntityTerritories - така както е написано, получаваш безкрайна рекурсия.

от staafl (5770 точки)


2

Качвам, решението си на 9 задача, като съм изчистил ако някоя от операциите в транзакцията се счупи и  неможе да се изпълни да се Rollback-не, като ползвам TransactionScope. Качвам го защото мисля, че останалите неща, които разгледах във форума, не правят това което трябва. Ако някой има по-хубаво и правилно решение, пишете.
http://pastebin.com/GP9keSS8


от AsenVal (3487 точки)


0
EntityFramework по принцип използва транзакции и няма нужда от изричен TransactionScope - макар че не вреди. За съжаление обаче това с catch(Exception) { return 0; } не ми харесва - чупи КПК поне по два начина.

от staafl (5770 точки)

0
не точно, това return 0 връща броя на променените записи, който в случая на catch е нула записи.

от AsenVal (3487 точки)



0
Забелязах, че на 9 задача, тази с Order-a и транзакцията, никой не е добавил по няколко OrderItems, както пише в условието или поне аз не забелязах. Правят се поръчки, но тези поръчки са празни без продукти в тях. Класът, който се ползва е OrderDetails, в който се добавят продуктите. Не знам, дали аз бъркам някъде.



0
напълно си прав - "Order" е т.нар. header на поръчката, към който се добавят OrderDetails, по един за всеки ред от фактурата.

от staafl (5770 точки)


0

Здравейте,

Ето едно решение на 9-та задача, което  поизчистих от първоначалното си решение.

Добавят се три поръчки, които са зададени по  прост начин - само чрез shipCity -  свойството. Ограничението за shipCity е 15 символа. Последната поръчка не се добавя успешно и данните не се запазват.

 

 


от Stefanpu (404 точки)


0

За 11. Задача - Creating Users in Admin Group, пробвах да мина само с един context.SaveChanges() и ми трябва feedback дали правилно мисля:

https://github.com/acreatist/taCSharp/blob/master/Databases/09_EntityFramework/NorthwindAPI/SimpleUsers.Client/Program.cs

Базата е с 2 таблици Users & Groups в релация много към много. В добавянето на users проверявам дали подадената група съществува - ако не, я създава и добавя обекта към контекста, след това - добавя user-a към навигационния лист и накрая - бута в db пре SaveChanges и затваря transaction scope-a.

Много ще съм благодарен за всеки feedback, че все още разчитам на магия, за да знам дали работят нещата..

Мерси!


от nickeyz (878 точки)


0

Eто и моите задача от 01-05. Хараса ми да пиша такива функции. Струват ми се много полезни.


Заради ламбда израза се използва знака зъ сравнение >= вместо => .
На 5-та задача форматта на датада може да фарира, коетто е хубаво.

GitHub



Заявката от 5-та задача:

            var result = db.Orders.
                Where(o => o.ShipRegion == region && o.OrderDate.HasValue && (o.OrderDate.Value >= parsedStart && o.OrderDate.Value <= parsedEnd));

    return result.ToList();

Забележете, че връщам List<Order> за да мога извъх функцияна при обхождането за изписвам различните пропъртита:


                foreach (var item in result)
                {
                    Console.WriteLine(item.Customer.CompanyName);
                }

 

Ако не върна лист ще ми изпише само item, което е нечетимо.



Поздрави!


от webmatrix (825 точки)


0

Здравейте,

относно 8-ма задача, в която трябва да се използва EntitySet<T>, тъй като в EF 6 този клас вече го няма, можете ли да ми предложите алтернативен вариант?

Благодаря!


от martin.nikolov (4535 точки)


0
Трябва да добавиш референция към Data.Linq, за да имаш достъп до EntitySet

от SStoyanov1 (1324 точки)