webForumDet fria alternativet

MVC: Entity Framework frågor

8 svar · 1 323 visningar · startad av thevice

theviceMedlem sedan dec. 2005198 inlägg
#1

Hejsan, ska försöka förklara hur jag menar så gott jag kan. Vet vad jag vill göra men har svårt att förklara det.

Jag vill separera mitt projekt så mycket som möjligt och även kunna lägga upp all kod så jag kan återanvända den vi senare tillfällen, vill även kunna byta ORM snabbt och smidigt om det skulle behövas. Med de målen i bakhuvudet så började jag mitt projekt och använda SubSonic som min ORM. I ett projekt så hade jag mina repositorys och mina entiteter för SubSonic. Då jag använde mig utav SobSonics SimpleRepository så var jag tvungen att använda mig utav interfaces till både mina repositorys och mina entiteter eftersom att man måste sätta attributes på vissa entiteter när man använder sig av SunSonic. Körde med dependency injection så inget utav mina andra projekt visste om SubSonic projektet vilket gjorde att det skulle vara snabbt och smidigt att byta ORM.
Vilket som så vart det för bökigt att ha interfaces till mina entiteter och jag ville slippa de och istället köra på Entity Framework 4.

Nu kommer det till de jag inte riktigt förstår eller vet hur jag ska göra. Jag vill ha det som förut där inget annat projekt vet om mitt EF projekt och vill fortfarande kunna byta snabbt och enkelt om så behövs. Det jag inte förstår är hur jag ska lösa det med mina entiteter.
EF skapar egna entiteter och då så måste jag ju ha en reference till mitt EF projekt om jag ska använda mig utav de. Sen så vill jag använda mig utav ASP.NET MVC 2 validationen där man sätter required osv på sina objects.

Hur ska jag tänka för att lösa detta? Måste jag använda mig utav EFs genererade entiteter och är de entiteterna samma sak som de man sätter sina attributes på? Vad ska jag googla på för att kunna hitta något om hur jag löser det så som jag vill ha? Fick för mig att det hette POCO men så var de tydligen inte.

Känner att jag har förklarat otroligt luddigt som vanligt men hoppas ni förstår.

theviceMedlem sedan dec. 2005198 inlägg
#2

Jag hade visst fel där, det var POCO klasser jag skulle göra. Nu återstår dock frågan om jag ska mina attributes i mina POCO klasser också för valideringen? Känns ju väldigt onödigt att sitta och göra exakt samma saker.

NickemannenMedlem sedan aug. 20003 575 inlägg
#3

Lägger du attribut i dina POCO klasser så är dom inte POCO längre :=)

theviceMedlem sedan dec. 2005198 inlägg
#4

Det har du helt rätt i. Dock så är det ända jag bryr mig om just ju är att man ska kunna byta ORM smidigt och jag anser att det inte gör någon större skillnad om jag har mina attribut på mina objekt i POCO klasserna så gör de ingen större skillnad så jag fortfarande kan byta till nHibernate eller L2S om jag skulle känna för det. Dock är det fortfarande fel, vad skulle du ge för tips om vart jag skulle lägga de? Just nu ligger alla mina POCO klasser i Model mappen och om jag skulle ha en till klass för validation så känns de ändå som om jag skulle förlora för mycket tid för att göra två likadana klasser med samma saker fast den ena har attribut?

NickemannenMedlem sedan aug. 20003 575 inlägg
#5

Allting beror lite på
Använder du dina objekt i någon annan applikation så är det ju inte rätt då du anpassar dina objekt väldigt mkt efter vyn isåfall kanske du skall ha ViewModels istället, det blir mer kod men bättre uppdelat.

Din viewmodel har hand bindningen mellan domänmodellen och vyn, samtidigt som den validerar och har den logik som du kanske lagt i Controllern annars som egentligen enbart skall vara en proxy eller dirigerare.

theviceMedlem sedan dec. 2005198 inlägg
#6

Nickemannen skrev:

Allting beror lite på
Använder du dina objekt i någon annan applikation så är det ju inte rätt då du anpassar dina objekt väldigt mkt efter vyn isåfall kanske du skall ha ViewModels istället, det blir mer kod men bättre uppdelat.

Din viewmodel har hand bindningen mellan domänmodellen och vyn, samtidigt som den validerar och har den logik som du kanske lagt i Controllern annars som egentligen enbart skall vara en proxy eller dirigerare.

Har också varit inne på ViewModels faktiskt. Ska tänka lite mer på det men det är troligtvis det som är smartast.

theviceMedlem sedan dec. 2005198 inlägg
#7

Har stött på ett irriterande problem. Eftersom att mina repositorys returerar klasser från mina POCO klasser så måste jag göra om värdet till mina ViewModels när jag ska presentera datan i mina views. Testade att använda mig utav AutoMapper men valideringen fungerar inte då. Uppdaterar jag så är ModelState.IsValid alltid false oavsett fast den ska vara true. Mina DisplayNameAttribute fungerar inte heller. Hur ska jag lösa detta så jag kan använda mig utav mina ViewModels för att presentera datan och valideringen?

theviceMedlem sedan dec. 2005198 inlägg
#8

Det var inget fel på valideringen utan när jag postar så skickas inte värderna med. Min kod ser ut så här:

[HttpPost]
public ActionResult Edit(UserViewModel viewModel) {
    if (ModelState.IsValid) {
        Mapper.CreateMap<UserViewModel, User>();
        User user = new User();
        AutoMapper.Mapper.Map(viewModel, user);
				
        _userRepository.EditUser(user);
        return Redirect("/");
    }

    AstronomiGuidenModelItem<UserViewModel> result = new AstronomiGuidenModelItem<UserViewModel> {
        Item = viewModel
    };

    return View(result);
}

"AstronomiGuidenModelItem" är troligtvis den som gör att det inte fungerar. Inget avancerat där:

public class AstronomiGuidenModelItem<T> : AstronomiGuidenModel {
    public T Item { get; set; }
}

Clientside validation fungerar som det ska. Dock så när den har validerat klart så är ModelState.IsValid false av någon konstig anledning. Men det kommer inga felmeddelanden som det ska göra. Några tankar om vad som kan vara fel?
Det är AstronomiGuidenModelItem<T> som det är fel på.

theviceMedlem sedan dec. 2005198 inlägg
#9

AstronomiGuidenModelItem<UserViewModel> löste det istälelt för att enbart ha UserViewModel. Dock är det några saker som jag funderar på. Låt oss säga att jag har en användar funktion. Då behöver jag en inloggning, glömt lösenords funktion och kunna ändra användarens uppgifter. Ska jag behöva ha en ViewModel för alla de olika funktionerna? Eftersom att när användaren loggar in så behövs enbart Användarnamnet och lösenordet. På glömt lösenordet så behövs enbart e-postadressen osv. Hur löser man detta? För att ha en ViewModel till varje liten sak känns ju fruktansvärt onödigt.
Syftar då främst på valideringen eftersom att den inte validerar om man inte har med alla fält i sin view som t.ex har Required på sig.

130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)