Oprettet tor. d. 05. august 2010 kl. 13:41:34

Henning3
Henning3 (3.065 point. Point ude: 180)

Interne entity objekt referencer og MSSQL join

Hejsa
Jeg undrer mig ofte over denne problemstilling, som jeg kunne tænke mig at dele med jer andre.

Når jeg modelere min database som entity objekter i et C# class lib. og vil mappe til en 'sub' tabel, i koden så laver jeg en instance af den, hvis ikke den findes i forvejen og laver en join i min SQL.

Problemet er så, at hvis der ingen ID er i den tabel, som man joiner med, så vises dataene jo bare ik.

DB NavneTabel:
----------------------------------
ID | Navn.... osv.
----------------------------------
01 | Peter
02 | Hans
03 | Niels
----------------------------------

DB ByTabel:
----------------------------------
ID | NavneID | By.... osv.
----------------------------------
01 | 01 | Esbjerg
02 | 02 | Ribe
03 | null | Vejle
----------------------------------

Hvordan fikser jeg noget der, både på kode siden men også i SQL delen?

Mvh H.

Skrevet tor. d. 05. august 2010 kl. 14:42:43| #1

softspot
softspot (100.685 point)
www.softspot.dk
Jeg er ikke sikker på at jeg forstår dit oplæg, men hvis du vil joine to tabeller hvor den refererede tabel (i dit tilfælde NavneTabel) ikke nødvendigvis indeholder en forekomst til primærtabellen, så kan du lave en left outer join i SQL, f.eks.

SELECT n.*, b.*
FROM ByTabel b
LEFT OUTER JOIN NavneTabel n ON n.ID = b.NavneID

I C# objektet kan du, alt efter hvad du vil opnå, oprette et tomt objekt til navne, hvor ID = 0 hvis navnet ikke eksisterer i forvejen i databasen. Du kan så i forbindelse med gem-operationen på by-objektets navn-objekt kontrollere om ID er nul og i så fald oprette det i databasen og ellers opdatere det, hvis ID er forskellig fra nul.

Alternativt kan du blot lade navn-objektet være null indtil det skal oprettes. Dette vil umiddelbart medføre flere check, da du skal sørge for at oprette det når der bliver brug for det. Dog vil det spare hukommelse at vente med at oprette det (det kunne jo være du slet ikke fik brug for det).

Jeg ved ikke om dette rent faktisk er det du tænker på, men det er i det mindste en gængs problemstilling :-)

Skrevet tor. d. 05. august 2010 kl. 15:02:41| #2

Henning3
Henning3 (3.065 point)
det er præcist det jeg tænker på!

og LEFT OUTER JOIN virke.... :-D

I C# mener du noget ala eller mangler jeg noget????


public class NavneEntity
{
  private ID int = 0;
  private by_Feld ByEntity = null;

  .........

public ByEntity By_Feld
{
get
  {
  if (by_Feld == null)
  {
    by_Feld = new ByEntity();
  }
  return by_Feld ;
  }
set
  {
  by_Feld = value;
  }
}
.....
}

Skrevet tor. d. 05. august 2010 kl. 15:28:40| #3

softspot
softspot (100.685 point)
www.softspot.dk
Hvis dette er dit objekt, så tror jeg du har byttet rundt på hvilken tabel der refererer hvilken i databasen. Det burde vel være navnetabel der refererede til bytabel med bytabellens id i navnetabel? Desuden er der lige et par syntaktise problemer med din C#-klasse (typen kommer før variabelnavnet). Bort set fra det, så er det nogenlunde det jeg mener, ja.

Dit tabeldesign skal nok se således ud:

DB NavneTabel:
----------------------------------
ID | Navn        | ById.... osv.
----------------------------------
01 | Peter      | 01
02 | Hans        | 02
03 | Niels      | null
----------------------------------

DB ByTabel:
----------------------------------
ID | By.... osv.
----------------------------------
01 | Esbjerg
02 | Ribe
03 | Vejle
----------------------------------

Skrevet tor. d. 05. august 2010 kl. 17:07:09| #4

janus_007
janus_007 (30.000 point)
Hej Henning

Det lyder som om du laver en masse manuelt arbejde for at mappe, har du kigget på Linq To Sql , Linq to Entities?

Her får du alt det trivielle forærende mht. db-connections, mapping, joins, select, insert, update, delete mv. Det eneste det kræver er at du har styr på dine databaserelationer.

Skrevet man. d. 09. august 2010 kl. 10:49:37| #5

Henning3
Henning3 (3.065 point)
-> softspot; det er rigtigt, at jeg har lavet taste fejl i både mit DB tabeldesign eksempel her, samt i C# klassen. Felterne er naturligvis lavet i DB, som du har tilrettet det. Sorry.

Skrevet man. d. 09. august 2010 kl. 10:51:03| #6

Henning3
Henning3 (3.065 point)
-> janus_007; det er rigtigt. Jeg kender værktøjerne, men det er ikke i alle tilfælde at jeg syntes det er passende at bruge dem. Og så kan jeg godt lide selv at lave tingene, én gang imellem :-)

Skrevet man. d. 09. august 2010 kl. 10:56:00| #7

Henning3
Henning3 (3.065 point)
Har f.eks. entity factory klasser, hvor jeg laver mapningerne:

public class NavneFactory : IDomainObjectFactory<NavneEntity>
    {

        public Wine Construct(IDataRecord record)
        {
            if (record == null)
                throw new ArgumentNullException("record");

            NavneEntity domainObj = new NavneEntity();

            domainObj.ID = record["Navne.ID"] is DBNull ? 0 : Convert.ToInt32(record["Navne.ID"]);

domainObj.Navn = record["Navne.Navn"] is DBNull ? string.Empty : (string)(record["Navne.Navn"]);

...............................

// Kald til objekt reference!

domainObj.ByEntity.ByNavn = record["By.Navn"] is DBNull ? string.Empty : (string)record["By.Navn"];

return domainObj;
}
    }

Skrevet man. d. 09. august 2010 kl. 10:58:02| #8

Henning3
Henning3 (3.065 point)
-> softspot; du skriver det er nogenlunde sådan du ville lave det i C# klassen???????

kommer du med et svar, så smider jeg points til dig. Det skulle jo nok have været et MSSQL spørgsmål, men hva f...! :-)

Skrevet man. d. 09. august 2010 kl. 12:29:07| #9

janus_007
janus_007 (30.000 point)
Henning3, nåh ja jeg synes det er totalt tidsspilde at lave trivielle ting som andre alligevel kan lave 100 gange bedre end mig selv.

Men ud af nysgerrighed... Hvilke tilfælde synes du ikke det passer til?

Skrevet tor. d. 11. august 2011 kl. 12:33:47| #10

Henning3
Henning3 (3.065 point)
beklager det sene svar...

Skrevet tor. d. 11. august 2011 kl. 12:42:51| #11

Henning3
Henning3 (3.065 point)
ups... troede jeg kunne vælge at give points når jeg valgte Svar i radioknaplisten. Smid et svar janus007, så smider jeg points.

Skrevet tor. d. 11. august 2011 kl. 12:43:21| #12

Henning3
Henning3 (3.065 point)
og softspot selvfølgelig.

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

asp.net dataset

Oprettet den 10. februar 2012 kl. 07.59
Mediate giver 30 point for svar | Giv et svar »

Hvordan håndteres 404 teknisk korrekt i asp.net

Oprettet den 8. februar 2012 kl. 06.56
trine_se giver 30 point for svar | Giv et svar »

WYSIWYG editor til CSS der kan arbejde med aspx filer

Oprettet den 7. februar 2012 kl. 09.59
pixiball giver 30 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger