Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Entity Framework 4 and SqlCe

Îåêßíçóå áðü ôï ìÝëïò Τάσκος Γιώργος. Τελευταία δημοσίευση από το μέλος Τάσκος Γιώργος στις 30-08-2010, 20:50. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  26-08-2010, 14:51 59761

    Entity Framework 4 and SqlCe

    Καλησπέρα σε όλους, είχα καιρό να συναντήσω "προβλήματάκια", σαν τα χιόνιαααα.

    Είπα να ξεκινήσω να δουλεύω κι εγώ σιγά σιγά το Entity Framework 4, και να φύγω από LINQ to SQL.
    Ξεκίνησα ένα project το όποιο θέλω να χρησιμοποιεί embedded database, κι έτσι κατέφυγα στην SqlCe λύση.

    Το πρώτο limitation που αντιμετώπισα είναι ότι δεν μπορώ να έχω Auto IDENTITY column και Entity Framework γιατί δεν υποστηρίζεται
    batch operations απο την SqlCe. Αυτό τώρα αντιμετωπίζεται είτε με uniqueidentifier  datatype και βγάζοντας δικά σου Guid.NewGuid() σε κάθε
    Entity Initialization και μετά δίνοντας αυτό το Guid σε κάθε child record, και ούτω καθεξης για κάθε Entity Relationship (κουραστικό αλλά είναι μία λύση).
    Η μπορείς να βγάζεις το επόμενο int Id βλέποντας το τελευταίο που έχεις στην βάση και να το δίνεις +1 στο Entity,
    (δεν δουλεύει με τα child records καθόλου όμορφα, και δεν μπορείς να κάνεις SaveChanges() και να πάρεις το επόμενο Id από την βάση, αλλάζει το enumeration λόγω refresh των Entities κτλ.)
    Μπορείς βέβαια να πάρεις το τελευταίο της βάσης και να αθροίζεις +1 σε κάθε record. φουυυ κουραστήκατε ήδη, damn SqlCe :P.

    Επισημάνω πως η βάση πρέπει να είναι embedded κυρίως για την αποφυγή SQL Server setup, για τον λόγο όσο το δυνατόν λιγότερα resources εκεί που θα τρέχει η εφαρμογή. (Γενικά portable application).

    Ακόμα ένα θέμα είναι ότι θέλω να δουλεύω με Detached Entities. Από ότι είδα όταν κάνεις Dispose το ObjectContext τα Entities δεν γίνονται Detached (όπως LINQ to SQL).
    Ένας τρόπος είναι να χρησιμοποιήσεις την μέθοδο Detach(), αλλά δεν κατάφερα να πάρω ολόκληρο το Object Graph, τα child records χάνονται!
    Ακόμη δοκίμασα με MergeOptions = NoTracking, μετά τραβάω με LINQ to Entities αυτά που θέλω βάζοντας .Include("ChildRelation") αλλά και πάλι παίρνω μόνο το Parent Entity.

    Όποιος έχει να προσθέσει ή να υποδείξει οτιδήποτε θα χαρώ :).
    Αν η προσέγγιση μου είναι λάθος παρακαλώ να με διορθώσετε.

    Ευχαριστώ εκ των προτέρων.

    Δημοσίευση στην κατηγορία: ,
  •  30-08-2010, 19:24 59836 σε απάντηση της 59761

    Απ: Entity Framework 4 and SqlCe

    Καλησπέρα μετά από διακοπές,

    Για τους ίδιους περίπου λόγους, είχα ξεκινήσει και εγώ Project Windows Forms με Entity Framework 4 και sql CE.
    Τα ίδια προβλήματα συνάντησα και εγώ, workarounds οπώς αναφέρεσαι και εσύ υπάρχουν αρκετά.

    Προσωπικά κατέληξα να κάνω χρήση SQLite λειτουργεί για Full Framework και Compact Framework , έχει κατα καιρούς χρησιμοποιηθεί από γνωστές εταιρίες
    λογισμικού στην Ελλάδα και το εξωτερικό.

    Η εντολή MergeOptions = NoTracking θα σου επιστρέψει τα αντικείμενα σε κατάσταση Detached.

    Κάνοντας Detach πάντα κάνει μόνο Detach την οντότητα που περνάς στην μέθοδο μόνο και όχι όλο το Object Graph.

    Αν για κάποιο λόγο θέλεις να κάνεις όλο το Object Graph Detach τότε κάνε clone

    public static T DetachObjectGraph<T>(this ObjectContext context, T entity)
      {
       using (MemoryStream stream = new MemoryStream())
       {
       

        //NetDataContractSerializer serializer = new NetDataContractSerializer();
        //serializer.Serialize(stream, entity);
        //stream.Position = 0;
        //return (T)serializer.Deserialize(stream);


        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(stream, entity);
        stream.Position = 0;
        return (T)formatter.Deserialize(stream);
       }

    }

     

    Με την Include θα έπρεπε να σου φέρει και τις οντοτήτες που εμφανίζονται ως Navigation Properties, αν δεν σου τις φέρνει, τότε έλεγξε τα παρακάτω :

    1. Ότι έχεις δώσει την σωστή ονομασία στο string μέσα στο .Include(""), προσοχή αν έχεις κάνει χρήση του Pluralization Service μπορεί πχ. το "ChildItem" να είναι λiστα και να εμφανίζεται ως "ChildItems".

    2. Αν χρησιμοποιείς .Include("") περισσότερες από μια φορά , υπάρχει περίπτωση να φορτωθούν οι οντότητες μόνο της μίας .Include("") , άλλαξε την σειρά που καλούνται και ίσως διορθωθεί.

    3. Οι σχέσεις στην βάση μπορεί να μην είναι δηλωμένες ή να μην είναι δηλωμένες σωστά.

    Για να ελέγξεις αν σου φέρνει τις οντότητες που δίνεις ως παράμετρο στην include, ρίξε μια ματιά στο Sql που παράγει το EF με την εντολή .ToTraceString()


     


    Μπλουγουράς Γιάννης
    Wizcom O.E.
  •  30-08-2010, 20:50 59837 σε απάντηση της 59836

    Απ: Entity Framework 4 and SqlCe

    Ευχαριστώ για την απάντηση,

    Θα δώ την λύση SQLite, για την ώρα παίζω με UNIQUE IDENTIFIER.

    Σε αυτή την λύση κατέληξα κι εγώ όσον αφορά το Detach :)

    1. Είναι σωστή γιατί έρχεται κανονικά το object graph αν τα φωνάξω σαν self tracking ή τώρα με την Detach clone method που έκανα.
    2. Εώς τώρα την χρησιμοποιώ μία φορά. θα το έχω υπόψην, thanks.
    3. Όλα ΟΚ με αυτά.

    Ευχαριστώ πολύ blu.



Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems