login  Naam:   Wachtwoord: 
Registreer je!
 Forum

ASP.NET C# MVC - DB via model

Offline Wijnand - 16/01/2009 16:17
Avatar van WijnandModerator Ik heb een externe MSSQL-server draaien hierzo. Deze wil ik gebruiken bij mijn ASP.NET C# website (MVC) op de juiste manier (via models).

Maar alle tutorials op het internet gaan er alleen maar over hoe je via de interne DB van visual studio kunt werken, maar ik wil echt via deze externe werken.

1.) Hoe kan ik de models goed krijgen?

2.) En als ik de models goed heb, hoe kan ik dan op de beste manier data ophalen in de controller en doorgeven aan de view?

58 antwoorden

Gesponsorde links
Offline Abbas - 16/01/2009 16:50
Avatar van Abbas Gouden medaille

Crew .NET
Hoe bedoel je "de Models goed krijgen"?

Als ze dan goed zijn, kan je heel eenvoudig met LinQ werken. Je haalt je data op en stopt die in de ViewData[""]. En die geef je dan mee met je ActionResult naar de View.

Voorbeeld:

  1. public ActionResult Index()
  2. {
  3. Lid newLid = (from l in dbM.Leden where l.Id == 1 select l).FirstOrDefault();
  4. string naam = newLid.UserName;
  5. ViewData["userName"] = naam;
  6. return View();
  7. }


En die ViewData["userName"] kan je dan in je View (aspx-pagina) gebruiken.
Offline nemesiskoen - 16/01/2009 21:15
Avatar van nemesiskoen Gouden medaille

PHP expert
  1. <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|DATABASENAAM.mdf;User Instance=true" ...


Zoiets zou je normaal gezien ergens moeten vinden in je web.config. Je databasefile gewoon op de juiste zetten, en je models zullen normaal gezien gewoon werken. En via Linq to SQl kan je ipv je tabellen te slepen deze gewoon aanmaken.
Offline Wijnand - 17/01/2009 11:21
Avatar van Wijnand Moderator Jaha.. ik bedoel het iets anders.

Ik heb MSSQL, op een externe server staan.
Ik heb zo'n connectie gemaakt, maar ik zag geen tabellen staan. Ik heb die spullen hier niet thuis liggen dus ik kan het niet bekijken.

Wat ik wil is dat ik de models kan zien en aanpassen, van de database-tabellen (eventueel wil ik die zelf wel aanmaken ;)).

En dan de gegevens ophalen (en dat zal wel kunnen zoals titjes dat zei, al snap ik niet wat die "l" betekend (from l)).


Ik ga maandag weer even kijken en zal dan uitgebreide informatie opsturen.
Offline nemesiskoen - 17/01/2009 13:27
Avatar van nemesiskoen Gouden medaille

PHP expert
Dat van titjes is "linq", dat is een query taal die een iets andere structuur heeft als SQL:-)

Citaat:
Wat ik wil is dat ik de models kan zien en aanpassen, van de database-tabellen (eventueel wil ik die zelf wel aanmaken ;)).

Normaal gezien kan je je db tabellen in een .dbml file slepen en worden je "pre-models" automatisch aangemaakt. Dan kan je via Repository je models maken, of je kan die "pre-models" gebruiken als models, dit is in de meeste gevallen best doenbaar. Maar als je zelf aanpassingen wil doen in je models, kan je best een klasse maken die met deze "pre-models" werkt, of laten erven van die klassen.

Aangezien de db niet in je solution zit maar erbuiten kan je dus die tabellen niet slepen, maar je kan ze wel gewoon aanmaken:
add->new file->linq to sql (geef een naam)
in die file/dat bestand kan je dan met rechtermuisknop: add->class. Vervolgens kan je naar de properties van die klasse gaan:
bij name vul je de naam in waarmee je deze wil aanroepen.
bij source vul je "dbo.JE_TABELNAAM" in.
Da ga je properties toevoegen aan deze klasse, en dan kan je per property weer de source toewijzen. En het type in de db, en het type in je code.

En zo kan je alles naar je goesting configureren. Je weet waar je binnekort tonnen informatie hierover kan vinden :-)
Offline Wijnand - 17/01/2009 13:40
Avatar van Wijnand Moderator Ok, dit ga ik zeker maandag uitproberen.

En over de laatste zin, eigenlijk nog niet.. geen link gezien :-)
Maar ik hoop dat het 'binnenkort' ontzettend 'binnenkort' wordt .
Offline Abbas - 17/01/2009 20:32 (laatste wijziging 18/01/2009 00:21)
Avatar van Abbas Gouden medaille

Crew .NET
Dat hopen wij ook!

Edit: fixed! 
Offline Wijnand - 18/01/2009 09:15 (laatste wijziging 19/01/2009 10:09)
Avatar van Wijnand Moderator Ik ben wel benieuwd joh 

Edit:
Hij werkt niet helemaal. Ik voeg een LINQ TO SQL CLASSES toe. Er wordt een bestand (DataClasses1.dbml) gemaakt met daarin een .dbml.layout en een designer.cs bestand.

Ik kan van .dbml een connection toevoegen naar een database (gedaan). Maar ik kan in die .dbml geen bestanden erbij zetten (classes). Hoe moet ik nu verder te werk gaan?

mvg,
Wijnand
Offline nemesiskoen - 19/01/2009 10:14
Avatar van nemesiskoen Gouden medaille

PHP expert
Kan je eens een print screen nemen van wanneer je in die .dbml file op rechtermuisknop drukt?
Offline Wijnand - 19/01/2009 10:18
Avatar van Wijnand Moderator Zoiets?

http://www.elem...orkoen.gif
Offline nemesiskoen - 19/01/2009 10:20 (laatste wijziging 19/01/2009 10:22)
Avatar van nemesiskoen Gouden medaille

PHP expert
http://img160.i...assuk4.jpg

of

http://img604.i...assuk4.jpg

1 van de twee links zou moeten werken:-)

Maar ik ben bang dat je voor die webservices niet met LINQ gaat kunnen werken, maar via een Repository je gegevens uit die webservice halen en presenteren op de manier die jij wil. Dus een nieuwe klasse maken (per tabel) en die dan gegevens laten fetchen uit de webservice. Of je moet echt rechtstreeks toegang hebben tot de database: username, password, ...
Offline Wijnand - 19/01/2009 10:25
Avatar van Wijnand Moderator Ja ok, ik heb de class toegevoegd, properties gewijzigt.

En dan sta ik stil Wat moet ik dan doen om bijvoorbeeld een overzicht eruit te krijgen?

Dat is waarschijnlijk een beginnersvraagje maar goed, ik kan dat niet zo snel vinden 
Offline nemesiskoen - 19/01/2009 10:33 (laatste wijziging 19/01/2009 10:34)
Avatar van nemesiskoen Gouden medaille

PHP expert
Geen probleem. Ik denk dat hier binnekort een tutorial over zal verschijnen ergens op een onverwachte plek 
maar even kort uitgelegd:
add->class
ga naar properties van die klasse

Access: public
inheritance modifier: none
name: naam_van_klasse_die_je_wil_gebruiken_in_je_programma
source: dbo.naam_van_tabel (volgens mij is het die syntax, niet 100% zeker)

en dan op de klasse rechtermuisknop:
add->property
Je zal zowiezo 1 primary key moeten hebben want linq moet 1 unieke property hebben om te kunnen bepalen welke data vanwaar komt en neemt hier standaard de primary key voor.
Dat doe je door de primary key bij properties van die property op "true" te zetten.

Na het toevoegen van alle klassen/tabellen kan je associaties gaan leggen: add->association en dan aangeven HOE ze verbonden zijn.

Ik raad je aan een AppController aan te maken en al je controllers daarvan te laten erven. Daar kan je dan je db initialiseren:

  1. public class AppController : Controller
  2. {
  3. protected DeNaamVanJeLINQFileDataContext db = new DeNaamVanJeLINQFileDataContext();
  4. // en nog andere dingen
  5. }


En dan in je controllers:

  1. public class JouwControllerNaamController: AppController
  2. {
  3. public ActionResult Index()
  4. {
  5. return View(db.EenTabelNaamInHetMeervoud.ToList());
  6. // dat meervoud is meestal gewoon een "s" er aanplakken als het géén engels woord is
  7. }
  8. }
Offline Wijnand - 19/01/2009 10:39
Avatar van Wijnand Moderator Ik heb het allemaal proberen te doen alleen snap ik "DeNaamVanJeLINQFileDataContext" niet.

Ik dacht dat dat de naam van mijn file was (MSSQL.dbml heb ik die genoemd) maar MSSQL() werkte niet. Dus waarschijnlijk is het dan iets anders.

En waar staat LdnDbDataContext voor?
Offline nemesiskoen - 19/01/2009 15:43 (laatste wijziging 19/01/2009 15:43)
Avatar van nemesiskoen Gouden medaille

PHP expert
LdnDB is de naam van mijn datacontext, dus dat moest weg:-)

Je moet dus: "-DeNaamVanJeLINQFile-DataContext" doen, dus:
NaamHierDataContext:

==> MSSQLDataContext
Offline Wijnand - 19/01/2009 15:56
Avatar van Wijnand Moderator
Citaat:
The type or namespace name 'MSSQLDataContext' could not be found


heb nu:
protected MSSQLDataContext db = new MSSQLDataContext();

Hij doet moeilijk om: MSSQLDataContext()
Offline nemesiskoen - 19/01/2009 16:02 (laatste wijziging 19/01/2009 16:02)
Avatar van nemesiskoen Gouden medaille

PHP expert
Ga eens naar de file MSSQL.designer.cs
De eerste klasse die je daar tegenkomt

  1. public partial class DE_KLASSE_NAAM: System.Data.Linq.DataContext


Zeg eens wat die klasse naam is?

Heb je wel de namespace JOUWSITE.models ingeladen?
Offline Wijnand - 19/01/2009 16:06
Avatar van Wijnand Moderator ok.. De_KLASSE_NAAM was nog niet gewijzigd in MSSQL..

Nu krijg ik de volgende error en dat heeft ermee te maken dat hij geen constructor kan vinden zonder argument....

Dus in AppControler staat:
MSSQLDataContext();

En in die model staat:
MSSQLDataContext(string connection)

Wat moet ik daar precies invullen? Dit zal vast een stomme vraag zijn.
Offline Abbas - 19/01/2009 16:09 (laatste wijziging 19/01/2009 16:12)
Avatar van Abbas Gouden medaille

Crew .NET
Die regel moet je gewoon zo laten, je moet daar normaal niets aan veranderen! 

Je moet daar enkel een Constructor toevoegen die geen parameter nodig heeft. Zorg dat je Connectionstring in je web.config steekt en dan heb je zoiets:

  1. public MSSQLDataContext() : base(global::System.Configuration.ConfigurationManager.ConnectionStrings["NaamVanJouwConnectionString"].ConnectionString, mappingSource)
  2. {
  3. OnCreated();
  4. }
Offline nemesiskoen - 19/01/2009 16:11 (laatste wijziging 19/01/2009 16:12)
Avatar van nemesiskoen Gouden medaille

PHP expert
Als er geen constructor is zonder argument, voeg dit dan eens toe:

  1. public MSSQLDataContext() : base(global::System.Configuration.ConfigurationManager.ConnectionStrings["MSSQLDBConnectionString"].ConnectionString, mappingSource)
  2. {
  3. OnCreated();
  4. }


Edit: Koen was me voor! 
Offline Wijnand - 19/01/2009 16:14
Avatar van Wijnand Moderator Ok, volgens mij doet hij het. Ik zie geen error meer. Ik zal even een voorbeeldje moeten gaan maken door de gegevens op te halen uit die model.. ik zal dat zometeen even testen.

Bedankt Koen!
Offline nemesiskoen - 19/01/2009 16:18 (laatste wijziging 19/01/2009 16:19)
Avatar van nemesiskoen Gouden medaille

PHP expert
Roflol, titjes en ik reageren hetzelfde, op dezelfde minuut 

@titjes: bij mij staat gij eerst...
aah ik kan niet volgen, pure verwarring!
Offline Abbas - 19/01/2009 16:22
Avatar van Abbas Gouden medaille

Crew .NET
Dat was omdat ik pas in m'n edit de code heb toegevoegd en als die edit klaar was zag ik da gij da ook al had gepost. 
Offline Wijnand - 19/01/2009 16:22
Avatar van Wijnand Moderator Heeft één van jullie een snel voorbeeldje om gegevens uit de database te halen en in een view te zetten? Het gaat om de tabel (eigenlijk class) 'test'. Dan kan ik even kijken of hij hem nu ook goed pakt.
Offline Abbas - 19/01/2009 16:27 (laatste wijziging 19/01/2009 16:33)
Avatar van Abbas Gouden medaille

Crew .NET
http://www.site...1#id209913

Allereerst zorg dat je in de Controller deze regel bovenaan hebt staan:

  1. using JouwProject.Models;

En binnen je Controller-Class dit:

  1. private MSSQLDataContext db = new MSSQLDataContext();

In je ActionResult van je Index ofzo kan je dan de code toepassen die ik gaf in m'n eerste reply:

  1. public ActionResult Index()
  2. {
  3. //De LinQ-query verder aanpassen aan jouw behoefte
  4. Lid newLid = (from l in db.test where l.Id == 1 select l).FirstOrDefault();
  5. string naam = newLid.UserName;
  6. ViewData["userName"] = naam;
  7. return View();
  8. }


De View van Index ziet er dan bijvoorbeeld zo uit, met deze regel ook weer bovenaan:

  1. <%@ Import Namespace="JouwProject.Models" %>

En dan ergens binnen je "body" zelf:

  1. <%= ViewData["userName"] %>
Offline Wijnand - 19/01/2009 16:33
Avatar van Wijnand Moderator Dit gaat meer tijd kosten dan ik verwacht had ;)

Ik heb nu deze 'query' waarbij het onderstreepte een error geeft:

Test newLid = (from t in Test where t.Id == 1 select t).FirstOrDefault();

De error:

Class TestMVC.Models.Test
Error: Could not find an implementation of the query pattern for souarch type 'TestMVC.Models.Test'. 'WHere' not found.
Offline Abbas - 19/01/2009 16:33
Avatar van Abbas Gouden medaille

Crew .NET
Dat moet dan zijn: db.Test
Offline Wijnand - 19/01/2009 16:35
Avatar van Wijnand Moderator Dat levert de volgende error op:
'TestMVC.Models.MSSQLDataContext' does not contain a definition for 'Test' and no extension method 'Test' accepting a first argument of type 'TestMVC.Models.MSSQLDataContext' could be found (are you missing a using directive or an assembly reference?)
Offline Abbas - 19/01/2009 16:39
Avatar van Abbas Gouden medaille

Crew .NET
Hm, dan moet je eens even wat meer code geven dan enkel de query. 
Offline Wijnand - 19/01/2009 16:41
Avatar van Wijnand Moderator Welke code wil je? 

Wat ik heb: In MSSQL.dbml een class genaamd 'Test' met daarin id en title die gekoppeld zitten aan een MSSQL database (gelijknamig).

Ik heb dus de volgende query:
Test newLid = (from t in db.Test where t.Id == 1 select t).FirstOrDefault();


Verder heb ik dus geen idee wat er fout zou kunnen zijn. Vooral omdat ik nooit een goed werkend script heb gezien die hetzelfde doet ;)
Offline Abbas - 20/01/2009 01:38
Avatar van Abbas Gouden medaille

Crew .NET
Met zelf er nog eens naar te zien en de reacties van Koen te lezen vond ik het antwoord op de fout. Ergens in de reacties spreekt hij dat je dan in je LinQ-query het meervoud van je tabelnaam moet gebruiken dan.

Open in Visual Studio je Class View (open het menu View -> Class View) en kijk in de structuur naar:

  1. - TesMVC
  2. + Project Preferences
  3. + TestMVC
  4. + ...
  5. - TestMVC.Models
  6. + MSSQLDataContext
  7. + Test

Klik éénmaal op die MSSQLDataContext. Onderaan je ClassView zie je dan een aantal items verschijnen en daar zal je "Tests" zien tussenstaan. Deze naam moet je gebruiken in je LinQ-queries, je kan deze ook wijzigen, maar het is gemakkelijk om je tabelnamen in het Engels te zetten want dan wordt er gewoon een "s" achter gezet. Een tabel "Lids" klinkt stommer dan bijvoorbeeld "Members". 

Je LinQ-query moet er dus zo uit zien:

  1. Test newLid = (from t in db.Tests where t.Id == 1 select t).FirstOrDefault();
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.26s