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?
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.
public ActionResult Index()
{
Lid newLid = (from l in dbM.Leden where l.Id == 1 select l).FirstOrDefault();
string naam = newLid.UserName;
ViewData["userName"] = naam;
return View();
}
public ActionResult Index()
{
Lid newLid =(from l in dbM.Leden where l.Id==1 select l).FirstOrDefault();
string naam = newLid.UserName;
ViewData["userName"]= naam;
return View();
}
En die ViewData["userName"] kan je dan in je View (aspx-pagina) gebruiken.
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.
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.
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 :-)
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?
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, ...
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:
public class AppController : Controller
{
protected DeNaamVanJeLINQFileDataContext db = new DeNaamVanJeLINQFileDataContext();
// en nog andere dingen
}
publicclass AppController : Controller
{
protected DeNaamVanJeLINQFileDataContext db =new DeNaamVanJeLINQFileDataContext();
public class JouwControllerNaamController: AppController
{
public ActionResult Index()
{
return View(db.EenTabelNaamInHetMeervoud.ToList());
// dat meervoud is meestal gewoon een "s" er aanplakken als het géén engels woord is
}
}
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.
Abbas - 19/01/2009 16:09 (laatste wijziging 19/01/2009 16:12)
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:
public MSSQLDataContext() : base(global::System.Configuration.ConfigurationManager.ConnectionStrings["NaamVanJouwConnectionString"].ConnectionString, mappingSource)
{
OnCreated();
}
public MSSQLDataContext():base(global::System.Configuration.ConfigurationManager.ConnectionStrings["NaamVanJouwConnectionString"].ConnectionString, mappingSource)
public MSSQLDataContext() : base(global::System.Configuration.ConfigurationManager.ConnectionStrings["MSSQLDBConnectionString"].ConnectionString, mappingSource)
{
OnCreated();
}
public MSSQLDataContext():base(global::System.Configuration.ConfigurationManager.ConnectionStrings["MSSQLDBConnectionString"].ConnectionString, mappingSource)
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.
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.
Abbas - 19/01/2009 16:27 (laatste wijziging 19/01/2009 16:33)
public ActionResult Index()
{
//De LinQ-query verder aanpassen aan jouw behoefte
Lid newLid = (from l in db.test where l.Id == 1 select l).FirstOrDefault();
string naam = newLid.UserName;
ViewData["userName"] = naam;
return View();
}
public ActionResult Index()
{
//De LinQ-query verder aanpassen aan jouw behoefte
Lid newLid =(from l in db.test where l.Id==1 select l).FirstOrDefault();
string naam = newLid.UserName;
ViewData["userName"]= naam;
return View();
}
De View van Index ziet er dan bijvoorbeeld zo uit, met deze regel ook weer bovenaan:
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?)
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:
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".