Avatar billede simpa Nybegynder
18. oktober 2012 - 11:00 Der er 52 kommentarer

Entity Framework many to many select...

Jeg har en relation mange til mange et tabel udlejning og vogn hvor udlejning er også knyttet til en tabel kunder.

Jeg vil gerne hive ud af databasen alle udlejninger ved et bestemt tidsrum hvor jeg vil gerne vise en kunde der har lejet en trailer...hvilke vogne og lidt at udlejning tabellen skal vises i en listview... det jeg har nu er

using(var context = Entities())
{
  var udlejet = (from p1 context.Udlejning
                from p2 context.Vogn
                from p3 context.Kunde
                where p3.Ledig == true &&
                p1.KundeId == p3.KundeId
                select new
                {
                    sætter nogle properties her...
                }
                  );
            udlejet.ToList();

             
}


Lidt pseudo kode...

Men når jeg kør det kode vises en udlejning 2 gange hvad gør jeg forkert her???

Måske fordi der skal 1 - many relation mellem udlejning og vogn

???
Avatar billede Syska Mester
18. oktober 2012 - 11:42 #1
Øhhh,

Kan du ikke lige smide et diagram af dine tabel.

Derudover bør du bruge navne som refererer dine tabeller i stedet for p1-p3 så dødelige mennesker ikke skal bruge unødig tid på at gennemskue dem. Men det var vist et side spor vi kom ind på her.

"Jeg vil gerne hive ud af databasen alle udlejninger ved et bestemt tidsrum hvor jeg vil gerne vise en kunde der har lejet en trailer...hvilke vogne og lidt at udlejning tabellen skal vises i en listview... det jeg har nu er"

Overstående virker lidt som en rodet beskrivelse. Er det trailere? Er der også vogne? Er de i samme tabel? Dette giver igen henledning til at vi skal have styr på hvordan dit DB design ser ud.
Avatar billede simpa Nybegynder
18. oktober 2012 - 12:24 #2
ok ER findes her http://simpa.dk/temp/ercampingforum.jpg

det der sker vises begge udlejninger fra i går men skal vise kun en fordi der skal en betingelse [Vogn].[VognId] = [Udlejning].[VognId] men det kan man ikke i mange til mange...
Avatar billede Syska Mester
18. oktober 2012 - 12:43 #3
Jeg kan ikke lige se problemet ... og slet ikke hvorfor du laver joins selv når de allerede findes.

var context = Entities()
context.Kunde.Where(a => a.KundeId == 10).Select(a => new {
// Hvad properties du nu vil have med ud ...
});

Du kan jo også:
context.Udlejnigns.Where(a => a.KundeId == 10).Select(a => new {
// Hvad properties du nu vil have med ud ...
});

Og så bør du lave dit projekt om til engelsk så navne bliver korrekte ... altså: Udleninger, Kunder & Vogne etc.

Det andet er bare ... i hvert fald træls for mig at se på.
Avatar billede simpa Nybegynder
18. oktober 2012 - 15:21 #4
Men jeg skal også selecte hvilke vogne er knyttet til den bestemte udlejning hvor jeg samtidig henter den bestemte kunde ud... Lad os sige 17 okt. eller 18 okt. hvor datoen skal med som parameter for at holde styr på hvilke er udlejet og hvilke er ledige...

Lad os sige vi tager den sidste eks... du har foreslået...
context.Udlejnigns.Where(a => a.KundeId == 10).Select(a => new {
// Hvad properties du nu vil have med ud ...
});

Her får du alle udlejninger hvor kundeid er 10 men jeg skal have alle udlejninger der er overhoveder er for den dag...+ tilhørende vogne... og ud over det skal jeg vide hvilke kunder har lejet noget...

så jeg skal både ha

                from u context.Udlejning
                from v context.Vogn
                from k context.Kunde

ud hvor jeg sender bare en dato som parameter hvor where
u.Udlejet == den dato som sendes som parameter...


Hvordan vil man gøre det??? tak :)
Avatar billede Syska Mester
18. oktober 2012 - 15:40 #5
context.Udlejnigns.Where(a => a.SomeDataField == somedato).Select(a => new {
a.Kunde, Udlejning = a, a.Vogns
});
Avatar billede simpa Nybegynder
18. oktober 2012 - 15:59 #6
Skal det ToList() og hvad er retur type??? AnonymyousType#1...
Avatar billede Syska Mester
18. oktober 2012 - 16:03 #7
Du selecter selv et anon object, så antager du ved hvad det er ... og nej, du kan ikke lave en liste af anon objecter. Nærmeste ville nok blive objects ... og så betyder det at blive noget lort.

Men du kan vel bare oprette nogen DTO klasser og bruge hvis du kun vil udtrække bestemte oplysninger.

mvh
Avatar billede simpa Nybegynder
18. oktober 2012 - 16:08 #8
sådan var metoden før:

public static List<AnonymyousType#1> VisUdlejning(DateTime dato)
        {
            using (var context = new CampingForumEntities())
            {
                //var query = (from p1 in context.Udlejnings
                //            from p2 in context.Vogns
                //            from p3 in context.Kundes
                //            where p2.Ledig == false &&
                //            p1.KundeId == p3.KundeId
                //            select new ExtendedUdlejning
                //            {
                //                TelefonNr = p3.TelefonNr.Value,
                //                Navn = p3.Navn,
                //                VognId = p2.Id,
                //                Type = p2.Type,
                //                LejeperiodeStart = p1.LejeperiodeStart.Value,
                //                LejeperiodeSlut = p1.LejeperiodeSlut.Value
                //            });

                //return query.ToList();

}

Sorry forstår ikk li helt hvordan jeg ska gøre det...

hvis jeg har:
return context.Udlejnings.Where(a => a.LejeperiodeStart == dato).Select(a => new
                {
                    a.Kunde new
                    {
                      properties...
                    },
                    Udlejning = a, <- hvad gør jeg her?
                    a.Vogns new
                    {
                      properties...
                    }
                });

skal jeg så...
Avatar billede Syska Mester
18. oktober 2012 - 16:45 #9
Du skrev i første du brugte et anonymt objecet ... det kan jeg så se her du ikke gør ... :-)

Men så kan du nok gøre noget ala:

return context.Udlejnings.Where(a => a.LejeperiodeStart == dato).Select(a => new ExtendedUdlejning()
                {
                    TelefonNr = a.Kunde.TelefonNr.Value,
                    Navn = a.Kunde.Navn,
                    Vogne = a.Vogns.ToList(),
                    LejeperiodeStart = p1.LejeperiodeStart.Value,
                LejeperiodeSlut = p1.LejeperiodeSlut.Value
                }).ToList();


Der kan være syntax fejl, men burde give dig en ide ...


Gør til din udlejning tidligere blev vist 2 gange er fordi du ikke fortæller alt fra start :-)

Hvis du laver en flad model af det du trækker ud så er det klar du vil få flere ... antaget følgende data:

1 Bruger ... har 1 udlejning med 2 biler ...

1 * 1 * 2 = 2 rækker ... Dvs data for bruger og udlejning vil være dubletter for de 2 forskellige biler.

Sådan er database ...

mvh
Avatar billede ntholm Nybegynder
18. oktober 2012 - 18:02 #10
"Jeg vil gerne hive ud af databasen alle udlejninger ved et bestemt tidsrum hvor jeg vil gerne vise en kunde der har lejet en trailer...hvilke vogne og lidt at udlejning tabellen skal vises i en listview... det jeg har nu er"

Du vil altså have alle udlejninger tilhørende en bestemt kunde - i en bestemt tidsperiode?

public List<Udlejling> GetUdlejlingToList(int kundeId, DateTime fromDate, DateTime toDate)
{
    return context.UdlejningSet.Where(x => x.KundeId.Equals(kundeId) && x.Dato > fromDate && x.Dato < toDate).ToList<Udlejling>();
}

Jeg prøver at forstille mig dit system. Skal det være sådan, at man vælger en kunde fra en kundeliste og så bliver videreført til en side med kundedetaljer hvor der også vises en liste over alle kundens udlejninger?

Med ado.net kommer relationerne til de tilhørende entities automatisk med når du hiver 1 enkelt entity ud fra context. Så du behøver ikke gøre det så besværligt for dig selv ;-)

Dvs. at når du først har instansieret din kunde fra context, så kan du returnere alle hans vogne fra en udlejning ved at skrive kunde.Vogns.ToList(); derefter hvis og hvis min røv er spids på den liste. (i din behind fil)

Håber det hjælper.
Avatar billede ntholm Nybegynder
18. oktober 2012 - 18:07 #11
ah.. jeg glemte lige en entitet til sidst.

altså  kunde.Udlejnings.Vogns.ToList();

Jeg må iøvrigt give buzz medhold i at dine entiteter bør være på engelsk ;-)
Avatar billede ntholm Nybegynder
18. oktober 2012 - 18:10 #12
doh.. se venligst bort fra den sidste kommentar. (hvorfor kan man iøvrigt ikke slette/redigere sine indlæg - det er da primitivt.)
Avatar billede simpa Nybegynder
20. oktober 2012 - 15:08 #13
følgende kode:

  public static List<ExtendedUdlejning> VisUdlejning(DateTime dato)
        {
            using (var context = new CampingForumEntities())
            {
                return context.Udlejnings.Where(a => a.LejeperiodeStart <= dato && dato <= a.LejeperiodeSlut).Select(a => new
                ExtendedUdlejning()
                {
                    TelefonNr = a.Kunde.TelefonNr.Value,
                    Navn = a.Kunde.Navn,
                    Vogne = a.Vogns.ToList(),
                    LejeperiodeStart = a.LejeperiodeStart.Value,
                    LejeperiodeSlut = a.LejeperiodeSlut.Value
                }).ToList();

}}

giver mig fejl:

LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[CampingForum.Vogn] ToList[Vogn](System.Collections.Generic.IEnumerable`1[CampingForum.Vogn])' method, and this method cannot be translated into a store expression.
Avatar billede ntholm Nybegynder
20. oktober 2012 - 15:38 #14
ahh okay nu kan jeg se hvad du gør. Du har en datatransfer class (extended)

Prøv at gør sådan her:

public static List<ExtendedUdlejning> VisUdlejning(DateTime dato)
        {
            using (var context = new CampingForumEntities())
            {
                List<Udlejnings> list1 =  context.Udlejnings.Where(a => a.LejeperiodeStart <= dato && dato <= a.LejeperiodeSlut).ToList<Udlejnings>();
                List<ExtendedUdlejning> list2 = new List<ExtendedUdlejning>();
                foreach (ExtendedUdlejning u in list1)
                {
                    ExtendedUdlejning eu = new ExtendedUdlejning(u);
                    list2.Add(eu);
                }
                return list2;
            }
        }


Og så skal din constructor metode i ExtendedUdlejnings.cs tage en udlejning som input - her sætter du alle proporties.
Avatar billede ntholm Nybegynder
20. oktober 2012 - 15:41 #15
bevar mig for typo's fordi du har danske entities ;)
Avatar billede ntholm Nybegynder
20. oktober 2012 - 15:55 #16
Når du laver en Extended class.. så sepererer du objektet fra dit dataset. Så kommer relationerne med lister til de andre objekter ikke automatisk med.

Din ExtendedUdlejning se ud af noget i den stil med det her.

public class ExtendedUdlejning
    {
        public string  Navn { get; set; }
        public string TelefonNr { get; set; }
        public List<Vogn> Vogne { get; set; }
        public DateTime LejeperiodeStart { get; set; }
        public DateTime LejeperiodeSlut { get; set; }

        public ExtendedUdlejning(Udlejning a)
        {
            this.Navn = a.Kunde.TelefonNr;
            this.TelefonNr = a.Kunde.TelefonNr;
            this.LejeperiodeStart = a.LejeperiodeStart;
            this.LejeperiodeSlut = a.LejeperiodeSlut;
            foreach (Vogn v in a.Vogns)
            {
                Vogne.Add(v);
            }
        }
    }

og igen.. det gik lidt stærkt.

håber det hjælper ;-)
Avatar billede Syska Mester
20. oktober 2012 - 16:13 #17
Udover at vogn stadig vil have relation til DB'en da det er referencen der bliver kopieret og ikke objectet. Dette kan så lede til laxy load af de data og smadre performance totalt.

Løsning ... opret også en DTO for Vogn.
Avatar billede ntholm Nybegynder
20. oktober 2012 - 16:32 #18
Ja - det tænkte jeg godt da jeg skrev det.

Men det er så en anden sag og så kan vi jo lige så godt lave DTOer til alle entities ;D
Avatar billede simpa Nybegynder
20. oktober 2012 - 20:39 #19
Tak for alle forslag lidt træls det første forslag ikke fungerede... Men jeg gjorde således:

public static List<ExtendedUdlejning> VisUdlejning(DateTime dato)
        {
            using (var context = new CampingForumEntities())
            {
                /*NOT WORKING EXAMPLE*/

                //return context.Udlejnings.Where(a => a.LejeperiodeStart <= dato && dato <= a.LejeperiodeSlut).Select(a => new
                // ExtendedUdlejning()
                // {
                //    TelefonNr = a.Kunde.TelefonNr.Value,
                //    Navn = a.Kunde.Navn,
                //    Vogne = a.Vogns.ToList(),
                //    LejeperiodeStart = a.LejeperiodeStart.Value,
                //    LejeperiodeSlut = a.LejeperiodeSlut.Value
                // }).ToList();



                /*WORKIING EXAMPLE*/

                var udlejning = (from u in context.Udlejnings.Include("Vogns").Include("Kunde").ToList()
                            where u.LejeperiodeStart <= dato && dato <= u.LejeperiodeSlut
                            select u).ToList();

                ExtendedUdlejning eu = new ExtendedUdlejning();
                List<ExtendedUdlejning> list = new List<ExtendedUdlejning>();

                foreach (Udlejning u in udlejning)
                {
                    eu.ExUdlejning = u;
                    eu.ExVogne = u.Vogns.ToList();
                    eu.ExKunde = u.Kunde;

                    list.Add(eu);
                    eu = new ExtendedUdlejning();
                }
                return list;
            }       
        }

så fungerede det...
mvh... :)
Avatar billede simpa Nybegynder
20. oktober 2012 - 20:40 #20
Det første er lidt smukkere kode...
Avatar billede Syska Mester
20. oktober 2012 - 22:51 #21
"ikke virkede" er en rimelig ringe beskrivelse :-)

Kan du ikke komme det lidt nærmere?

Da du på din måde højssansynlig vil få en n+1 operation for at gøre det på den måde. Entity Framework er ikke klogere ... NHibernate tror jeg er klog nok til at se et mønster og på den måde måske nøjest med en 1+1 ...

Læs mere om n+1 her: http://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem

Hvis du kommer med lidt mere info kan vi måske løse dit "NOT WORKING EXAMPLE" :-)
Avatar billede simpa Nybegynder
20. oktober 2012 - 23:54 #22
Som jeg skrev tidligere:

jeg fik denne fejl
LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[CampingForum.Vogn] ToList[Vogn](System.Collections.Generic.IEnumerable`1[CampingForum.Vogn])' method, and this method cannot be translated into a store expression.

Det skete her:
Vogne = a.Vogns.ToList(),

Vogne er List<Vogn>

Det er runtime fejl...
Avatar billede Syska Mester
21. oktober 2012 - 00:43 #23
Hvad for en version af EntityFramework bruger du?

Jeg bider nemlig mest mærke i dette: "and this method cannot be translated into a store expression."

Bruger selv EF 4 og 5 ... og der burde der nemlig være support for det.

Hvordan kan du angive eager load i EF?
Avatar billede simpa Nybegynder
21. oktober 2012 - 01:50 #24
Det er en win forms app...som kør under framework .net 4.0...jeg mener det er EF 4 = v4.0.30319 jeg tror ikke det er en v1 fordi v1 kør under 3.5 frameworket...
Avatar billede Syska Mester
21. oktober 2012 - 02:22 #25
og .NET 4 har en anden indbygget crap version :-)

Jeg kører med den fra http://nuget.org/packages/EntityFramework

hvor den løbende bliver opdateret. Dog er der ingen support endnu for Wizard/Designer ting, som der er i den indbyggede. Så det kan gøre træls alt efter hvordan man arbejder.

Jeg skal ikke præcis kunne sige hvordan den query kaster op ... men EF1-4 som er indbygget har efter min mening alt for mange mærkelige bugs :-(. Problemet er som sådan at den tidligere kun blev opdateret ved .NET versions skift og der kan gå MEGET lang tid som du nok allerede ved.

Nu da det er en selvstændig pakke, er de hele tiden opdatere den når bugs bliver fixed.

Håber du kan leve med den dårligere performance ved nummer to query ellers kunne du jo prøve den nye og bedre fra www.nuget.org

Du kan måske også være heldig en anden herinde har en løsning om hvorfor det ikke virker.
Avatar billede Syska Mester
21. oktober 2012 - 02:23 #26
test
Avatar billede simpa Nybegynder
21. oktober 2012 - 11:10 #27
Jeg var inde og hente nuget...og fulgte denne guide http://www.codeproject.com/Articles/388249/How-to-configure-and-use-Entity-Framework

Men jeg får samme fejl...

LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[CampingForum.Vogn] ToList[Vogn](System.Collections.Generic.IEnumerable`1[CampingForum.Vogn])' method, and this method cannot be translated into a store expression.

ved at køre det her:
return context.Udlejnings.Where(a => a.LejeperiodeStart <= dato && dato <= a.LejeperiodeSlut).Select(a => new
                ExtendedUdlejning()
                {
                    TelefonNr = a.Kunde.TelefonNr.Value,
                    Navn = a.Kunde.Navn,
                    Vogne = a.Vogns.ToList(),
                    LejeperiodeStart = a.LejeperiodeStart.Value,
                    LejeperiodeSlut = a.LejeperiodeSlut.Value
                }).ToList();
Avatar billede ntholm Nybegynder
21. oktober 2012 - 11:21 #28
Har du sørget for at ExtendedUdlejnings Vognliste kun kan indeholde Vogne?

Prøv at lave constructoren i ExtendedUdlejning så at den tager en Udlejning som input - og sæt dine poperties ExtendedUdlejning dér.

Jeg har oven i købet skrevet både klasse og metoder til dig ovenover - det burde virke sådan.
Avatar billede simpa Nybegynder
21. oktober 2012 - 11:35 #29
Sådan ser min VisUdlejning metode ud:

public static List<ExtendedUdlejning> VisUdlejning(DateTime dato)
        {
            using (var context = new CampingForumEntities1())
            {
                /*NOT WORKING EXAMPLE*/

                return context.Udlejnings.Where(a => a.LejeperiodeStart <= dato && dato <= a.LejeperiodeSlut).Select(a => new
                ExtendedUdlejning()
                {
                    TelefonNr = a.Kunde.TelefonNr.Value,
                    Navn = a.Kunde.Navn,
                    Vogne = a.Vogns.ToList(),
                    LejeperiodeStart = a.LejeperiodeStart.Value,
                    LejeperiodeSlut = a.LejeperiodeSlut.Value
                }).ToList();



                /*WORKIING EXAMPLE*/

                //var udlejning = (from u in context.Udlejnings.Include("Vogns").Include("Kunde").ToList()
                //            where u.LejeperiodeStart <= dato && dato <= u.LejeperiodeSlut
                //            select u).ToList();

                //ExtendedUdlejning eu = new ExtendedUdlejning();
                //List<ExtendedUdlejning> list = new List<ExtendedUdlejning>();

                //foreach (Udlejning u in udlejning)
                //{
                //    eu.ExUdlejning = u;
                //    eu.ExVogne = u.Vogns.ToList();
                //    eu.ExKunde = u.Kunde;

                //    list.Add(eu);
                //    eu = new ExtendedUdlejning();
                //}
                //return list;
            }       
        }


Sådan ser min ExtendedUdlejning ud:

class ExtendedUdlejning
    {
        /*first method*/
        public int TelefonNr { set; get; }
        public string Navn { set; get; }
        public List<Vogn> Vogne { set; get; }
        public DateTime LejeperiodeStart { set; get; }
        public DateTime LejeperiodeSlut { set; get; }


        /*The second method working one*/
        public List<Vogn> ExVogne { set; get; }
        //public Kunde ExKunde { set; get; }
        //public Udlejning ExUdlejning { set; get; }
    }
Avatar billede Syska Mester
21. oktober 2012 - 15:05 #30
Prøv at gøre class public .... Et eller andet siger mig det nogen kan kan gøre fejlen da drt er en ekstern assembly der skal oprette den.
Avatar billede simpa Nybegynder
21. oktober 2012 - 18:10 #31
Det hjalp ikk får samme fejl...:(
Avatar billede ntholm Nybegynder
21. oktober 2012 - 18:51 #32
I den kode du poster har du 2 vognlister - laver den fejl fordi du har glemt at out-commente den ene?

Ellers prøv at gøre som jeg siger ;-) Jeg har lavet præcis det samme flere gange før.

Lav en constructor i din ExtendedUdlejning.cs som tager en Udlejning som input - og sæt alle properties dér.

public class ExtendedUdlejning
{
    public string  Navn { get; set; }
    public string TelefonNr { get; set; }
    public DateTime LejeperiodeStart { get; set; }
    public DateTime LejeperiodeSlut { get; set; }
    public List<Vogn> Vogne { get; set; }

    public ExtendedUdlejning(Udlejning a)
    {
        this.Navn = a.Kunde.Navn;
        this.TelefonNr = a.Kunde.TelefonNr;
        this.LejeperiodeStart = a.LejeperiodeStart;
        this.LejeperiodeSlut = a.LejeperiodeSlut;
        foreach (Vogn v in a.Vogns)
        {
            Vogne.Add(v);
        }
        // eller evt.
        // Vogne = (List<Vogn>)a.Vogns.ToList();
    }
}

Hold det adskilt - ellers får du redundant code næste gang du skriver en metode der henter ExtendedUdlejninger (for så skal du sætte properties igen).

public static List<ExtendedUdlejning> VisUdlejning(DateTime dato)
{
  using (var context = new CampingForumEntities())
  {
    List<Udlejning> list1 =  context.Udlejnings.Where(a => a.LejeperiodeStart <= dato && dato <= a.LejeperiodeSlut).ToList<Udlejning>();

    List<ExtendedUdlejning> list2 = new List<ExtendedUdlejning>();

    foreach (Udlejning u in list1)
    {
      ExtendedUdlejning eu = new ExtendedUdlejning(u);
      list2.Add(eu);
    }
    return list2;
  }
}

Du kan selvfølgelig godt forkorte den sidste metode - nu blev det bare lige molbo-måden.
Avatar billede ntholm Nybegynder
21. oktober 2012 - 18:57 #33
Ellers:

Når du skriver Vogns.ToList(); - skal du istedet skrive:
Vogn.ToList<Vogn>();

Ellers prøv at gøre det mere typestærkt:
(List<Vogn>)Vogn.ToList<Vogn>();
Avatar billede ntholm Nybegynder
21. oktober 2012 - 18:59 #34
Jeg ser at jeg laver nogle typos hist og her.

(List<Vogn>)Vogns.ToList<Vogn>();
Avatar billede simpa Nybegynder
21. oktober 2012 - 19:15 #35
ntholm tak for dine forslag men har jeg prøvet...
Avatar billede Syska Mester
21. oktober 2012 - 19:48 #36
Men bottom line er nok ... EF4 ser jeg som forældet og fyldt med fejl.

Spring på EF5 fra www.nuget.org og lav lidt mapping magic. Der er RIGTIG mange ting som er fixed i den version.

Udover det, så har du også Enum support i EF5 hvis du kører på .NET 4.5. Awesome feature som jeg selv har ventet på.

Jeg er i hvert fald løbet tør for ideer hvorfor det ikke lige virker.
Avatar billede simpa Nybegynder
22. oktober 2012 - 02:29 #37
kender du det når man lige har skrevet halv stil og så trykker man opret og så er det hele bare væk... hmmm...
Avatar billede Syska Mester
22. oktober 2012 - 03:06 #38
Det kan ske at være pga Ekspertens cache ... den sutter om natten af en eller anden fjollet grund.

De gider ikke fikse det ... ABER.

Men altid huske at kopiere inden man poster pga ekspertens super RINGE login system og cache.
Avatar billede simpa Nybegynder
22. oktober 2012 - 13:56 #39
Men jeg skrev at det var ikke sikkert projektet blev opdateret til at bruge EF5 bare fordi man smider en reference dll. Men det burdte nuget gøre automatisk når man klikker install...

Ja jeg har googlet en del... at EF4.4 er til .net 4.0 men fandt også ud af at 5.0 kan også bruges i 4.0 dog er der nogle ting der ikke fungerer...

ellers har jeg prøvet at søge entity framework i nuget og der var kun v5 jeg kunne se så den installerede jeg...(tror du ikke det er noget de selv holder styr på? om det er VS2010 eller vs2012)

Om jeg fjerner referencen eller beholder den så kan projektet kompilere...

Medmindre jeg fjerner Model.edmx helt og prøver at få det ind igen men det har jeg prøvet...


mvh...
Avatar billede Syska Mester
22. oktober 2012 - 14:11 #40
"Men jeg skrev at det var ikke sikkert projektet blev opdateret til at bruge EF5 bare fordi man smider en reference dll. Men det burdte nuget gøre automatisk når man klikker install..."

Oversteånde synes jeg ikke lige giver nogen mening ... du bruger en anden version, så selvfølgelig skifter den ikke lige A ud med B ...

"Ja jeg har googlet en del... at EF4.4 er til .net 4.0 men fandt også ud af at 5.0 kan også bruges i 4.0 dog er der nogle ting der ikke fungerer..."

Ja, EF5 kan køre på .NET 4 ... ved ikke lige hvor du har fundet en version 4.4 af EF. EF5 har ikke support for Enums hvis du ikke kører på .NET 4.5.

Du skal specificere hvis du ikke vil have default version. De har noget der kigger på hvad version af .NET du kører.

Designer og alt det bruger den indbyggede version i .NET 4.0 ... så du kan ikke bare installere den NuGet pakke og dermed forvente at den bruger EF fra NuGet.

Hvis du vil bruge den pakke fra NuGet så skal du lave din DbContext selv ...

Jeg ved de arbejder på en Extensions til det.
Avatar billede Syska Mester
22. oktober 2012 - 14:47 #42
Ja, men den løsning er bare utra skod efter min mening, hvis det også var den jeg prøvede.

Den kigger på ens EF4(.NET 4) genereret klasser og ud fra den laver DbContext klasser, som kan bruges med den nye version af EF.

Håber på de snart laver en nice løsning som bruger den rigtige version hele vejen igennem.

Jeg forslog ikke overstående da jeg synes den SUX.
Avatar billede Syska Mester
22. oktober 2012 - 14:49 #43
Men udover det ... så synes jeg ikke det tager så lang tid at lave sine egne entity klasser og lidt mapping. 1-2 timer for 20+ tables med relations etc.

Når det så er gjort på den måde, så har man også 100% kontrol over hvad der sker ...
Avatar billede simpa Nybegynder
22. oktober 2012 - 15:23 #44
Ok men brugte den løsning det eneste jeg skal gøre er at slette Model1.Designer.cs efter en update af db (medmindre der er en smartere måde???)... Så nu jeg kørende med EF5 og endelig prøvede jeg den metode det var så spændende og se om det ville funke...og jeg siger dig... noooouuuu!!! får samme fejl:

LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[CampingForum.Vogn] ToList[Vogn](System.Collections.Generic.IEnumerable`1[CampingForum.Vogn])' method, and this method cannot be translated into a store expression.
Avatar billede Syska Mester
22. oktober 2012 - 15:57 #45
Er du helt 100% på det er samme Vogn der er reffereret?

Det der slår mig nu er at det hele sted står dem som "Vogn" hvor den det andet sted står som "CampingForum.Vogn" ...
Avatar billede Syska Mester
22. oktober 2012 - 15:58 #46
Hvis du kan lave et lille eksemple så vil jeg meget gerne teste det på mit system og løse det for dig ... jeg kan desværre ikke genskabe det problem.
Avatar billede Syska Mester
22. oktober 2012 - 16:02 #47
Hvad sker der hvis du smider eager load ind .. .

http://msdn.microsoft.com/en-us/data/hh949853.aspx

Kig på punkt 8.2 ...

Så dit bliver til:
return context.Udlejnings.Include(a => a.Vogns).Include(x => x.Kunde).Where(a => a.LejeperiodeStart <= dato && dato <= a.LejeperiodeSlut).Select(a => new
                ExtendedUdlejning()
                {
                    TelefonNr = a.Kunde.TelefonNr.Value,
                    Navn = a.Kunde.Navn,
                    Vogne = a.Vogns.ToList(),
                    LejeperiodeStart = a.LejeperiodeStart.Value,
                    LejeperiodeSlut = a.LejeperiodeSlut.Value
                }).ToList();

Du skal have en using statement med:
using System.Data.Entity;

Burde være den rigtige i forhold til: http://stackoverflow.com/questions/12085353/how-to-use-include-after-oftype
Avatar billede simpa Nybegynder
22. oktober 2012 - 16:14 #48
Hvis jeg kør det nederste kode får jeg fejl:

LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[CampingForum.Vogn] ToList[Vogn](System.Collections.Generic.IEnumerable`1[CampingForum.Vogn])' method, and this method cannot be translated into a store expression.
Avatar billede Syska Mester
22. oktober 2012 - 16:23 #49
Pas.

Hvis du kan lave et lille eksempel som giver denne fejl vil jeg gerne kigge på det eller vil jeg melde pas.
Avatar billede simpa Nybegynder
29. oktober 2012 - 15:30 #50
Fandt fejlen... kom i tanker om da jeg arbejdede med linq2sql før havde jeg using med.

Men jeg fjernede using og så fungerede det... :)
Avatar billede Syska Mester
29. oktober 2012 - 15:37 #51
Dvs hvordan kom det så til at se ud ... ?

Jeg kan ikke lige gennemskue hvorfor en Dispose på din context skulle gøre nogen forskel.
Avatar billede simpa Nybegynder
29. oktober 2012 - 16:10 #52
public static List<ExtendedUdlejning> VisUdlejningTest(DateTime dato)
        {
            var context = new CampingForumEntities1();

            /*NOT WORKING EXAMPLE*/
            //return ||
            //var i = context.Udlejnings.Where(a => a.LejeperiodeStart <= dato && dato <= a.LejeperiodeSlut).Select(a => new
            //ExtendedUdlejning()
            //{
            //    TelefonNr = a.Kunde.TelefonNr.Value,
            //    Navn = a.Kunde.Navn,
            //    Vogne = a.Vogns.ToList(),
            //    LejeperiodeStart = a.LejeperiodeStart.Value,
            //    LejeperiodeSlut = a.LejeperiodeSlut.Value
            //}).ToList();

            /*NOT WORKING EXAMPLE*/
            var i = context.Udlejnings.Include("Vogn").Include(x => x.Kunde).Where(a => a.LejeperiodeStart <= dato && dato <= a.LejeperiodeSlut).Select(a => new
            ExtendedUdlejning()
            {
                TelefonNr = a.Kunde.TelefonNr.Value,
                Navn = a.Kunde.Navn,
                Vogne = context.Vogns.Where(o => a.vogn_udlejning.Select(q => q.vogn_id).ToList().Contains(o.Id)).ToList(),
                LejeperiodeStart = a.LejeperiodeStart.Value,
                LejeperiodeSlut = a.LejeperiodeSlut.Value
            }).ToList();

            return i;
        }
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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