Avatar billede henrik_40 Juniormester
17. oktober 2014 - 18:19 Der er 12 kommentarer og
1 løsning

Tilføj tabel til Entity Framework

Hejsa
Jeg er igang med at lave en windows-service.

Jeg har lavet et entity framework og fået en class:

public partial class Model1 : DbContext

Klassen indeholder definitioner på mine tabeller fra databasen.

Nu skal jeg have tilføjet en enkelt tabel. Normalt gør jeg det grafisk i en .edmx-fil. Problemet er at jeg ikke har filen???

Hvad gør jeg?
Avatar billede softspot Forsker
17. oktober 2014 - 19:14 #1
Tilføj en egenskab at typen generic DbSet, f.eks.:

public class Model1 : DbContext
{

  // ....

  public DbSet<NyKlasse> NyeKlasser { get; set; }

  // ....
}


hvor NyKlasse er den klasse du skal have tilføjet i databasen.
Avatar billede henrik_40 Juniormester
20. oktober 2014 - 12:11 #2
da jeg oprettetede frameworket, tilføjede jeg kun de tabeller/klasser som jeg havde brug for på det tidspunkt. Nu skal jeg have tilføjet nye tabeller/klasser, derfor kender frameworket ikke tabellen og jeg kan ikke lave det du beskriver.

Normalt plejer jeg at få en edmx-fil hvor jeg grafisk tilføjer tabeller, så jeg ved ikke hvad jeg gør her.
Avatar billede henrik_40 Juniormester
20. oktober 2014 - 12:13 #3
Jeg kan se at der i model-klassen er definitioner på alle tabellens felter:

        public virtual DbSet<Activities> Activities { get; set; }


        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Activities>()
                .Property(e => e.ContactName)
                .IsUnicode(false);

            modelBuilder.Entity<Activities>()
                .Property(e => e.CustomerName)
                .IsUnicode(false);
.......
...
...

Skal jeg tilføje næste tabel på samme måde?
Avatar billede henrik_40 Juniormester
20. oktober 2014 - 12:15 #4
1) oprette klasse indeholdende tabellens navn

public Activities()
        {
            ActivityDetails = new HashSet<ActivityDetails>();
        }

        [Key]
        public int ActivityID { get; set; }

        public short ActivityTypeID { get; set; }


osv.
2)

protected override void OnModelCreating(DbModelBuilder modelBuilder)


            modelBuilder.Entity<Activities>()
                .Property(e => e.ContactName)
                .IsUnicode(false);

            modelBuilder.Entity<Activities>()
                .Property(e => e.CustomerName)
                .IsUnicode(false);


....
..
.

Er det sådan?
Avatar billede henrik_40 Juniormester
20. oktober 2014 - 12:21 #5
og et spørgsmål mere i relation til ovenstående.
Hvis jeg ændrer tabeller.. tilføjer, fjerner felter, referencer. Skal jeg så alle klaserne osv. igennem for at rette til?

(Det lyder bøvlet, jeg håber ikke der er sådan)
Avatar billede henrik_40 Juniormester
20. oktober 2014 - 13:24 #6
Måske er der her en bedre forklaring til mit problem:
Hvis I følger videoen her:
http://msdn.microsoft.com/en-us/data/jj200620.aspx
Eller scroller ned til punkt 3. Reverse Engineer Model

Det er det jeg har gjort hidtil.

Som det ses  har han tilføjet to tabeller.

Jeg ønsker nu bare efterfølgende at tilføje en tabel fra min database.

Hvordan gør jeg det?
Avatar billede softspot Forsker
20. oktober 2014 - 13:53 #7
Jeg har taget udgangspunkt i code first (hvilket er det eneste jeg har arbejdet med ifm. EF). Om det er muligt at aktivere code first på dit aktuelle projekt, er jeg usikker på, men hvis du har projektet liggende i versionsstyring, kunne du jo prøve. Du skal muligvis sætte din DataContext op til code first. Dette gøres i Package Manager Console (PMC) med kommandoen Enable-Migrations.

Derefter opretter du din klasse og føjer den til din DataContext (som jeg illustrerede tidligere), efterfulgt af en Add-Migration-kommando (igen i PMC) og til sidst en Update-Database for at få tabellen oprettet i din database.

Søg efter Code First ifm. EF. I søgeresultaterne vil du nok også finde detaljerede instruktioner i, hvordan man aktiverer migrations og opdaterer sin datacontext...

Jeg ved ikke om du kan bruge ovenstående til noget, men om ikke andet kan du måske bruge det som inspiration.
Avatar billede softspot Forsker
20. oktober 2014 - 13:56 #8
Ja, OK, det var så noget af det du selv havde linket til. Så du i øvrigt dette link nederst i artiklen (som jeg tænker er relevant ifht. det jeg beskriver): http://msdn.microsoft.com/en-us/data/dn579398
Avatar billede henrik_40 Juniormester
20. oktober 2014 - 14:33 #9
Hej
Jo det hjælper en del hvad du skriver. Jeg har vist blandet tingene sammen: EDMX-filen og "Code-First" er forskellige måder at tilgå databasen på: code-first laver jeg koden, som tilføjer tabeller osv til databasen. Rigtigt forstået?

Jeg ønsker at gå modsatte vej: Tage tabellerne fra en allerede database, og så er code-first ikke den rigtige måde at gøre det på?

Det er sådan jeg forstår dig og videoklippet.

Databasen er live, så der må passes på at den ikke bliver ændret. Jeg har lavet et testslet-projekt hvor jeg kan teste. Hvis jeg går den slagne vej ved at lave klasser for hver tabel og tilføje attributter som jeg kan se er automatisk genereret, virker det, men hvordan gør du når du finder ud af at du skal tilføje en tabel fra databasen? Du laver måske alt "code-first" (altså opretter ikke tabeller i databasen udenom koden)?
Avatar billede softspot Forsker
20. oktober 2014 - 17:46 #10
Code First er ikke en metode at tilgå databasen på, men en metode at definere databasen på.

Bort set fra det, så lyder det til, at vi har en fælles forståelse af, hvordan det hænger sammen :). Dog vil jeg definere Code First, som at definere tabeller i datbasen via kode, ikke udenom kode.

Ja, jeg har kun arbejdet med Code First, fordi jeg typisk har arbejdet med nye projekter. Dog har jeg, for 2-3 år siden som et eksperiment, prøvet at generere klasser ud fra en eksisterende database, men hvordan man holder en eksisterende DataContext synkroniseret med en database uden Code First, ved jeg ikke. Da jeg forsøgte mig med det, fandtes der kun en one-shot løsning til denne problemstilling (som var en add-in til VS). Der er dog løbet meget vand under broen siden da, så det kan være der findes en løsning på dette nu.

Jeg tænker dog stadig, at det må kunne lade sig gøre at skifte til Code First, når du først har fået genereret dine klasser ud fra databasen i første omgang. Således kan du vedligeholde dit databaseschema via Code First fremefter. Tjek lige dette link (hvis du ikke allerede har gjort det): http://msdn.microsoft.com/en-us/data/dn579398
Avatar billede henrik_40 Juniormester
20. oktober 2014 - 18:29 #11
Hej Softspot
Heldigvis er det en lille windowsservice, som fungerer uafhængigt. Det gik godt "the-hard-way".

Du har givet mig noget at tænke over og jeg læse noget mere på det og ikke mindst kigge på de links du har givet mig ;)

Så jeg vil gerne give dig point.

Læg et svar.
Avatar billede softspot Forsker
20. oktober 2014 - 20:30 #12
Velbekomme :-)
Avatar billede henrik_40 Juniormester
21. oktober 2014 - 15:45 #13
Hej igen
lige et spørgsmål ekstra ;)
Hvordan får du koden sat i en firkant (#1) her på eksperten?

nb. hvis du skulle vide noget om windows-service er jeg stødt på endnu en lukket dør :-(

http://www.eksperten.dk/spm/998687
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester