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

 

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

The property 'Id' is part of the object's key and cannot be changed. (EF4 & STE)

Îåêßíçóå áðü ôï ìÝëïò Μπλουγουράς Γιάννης. Τελευταία δημοσίευση από το μέλος Μπλουγουράς Γιάννης στις 17-08-2010, 13:33. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  17-08-2010, 11:12 59674

    The property 'Id' is part of the object's key and cannot be changed. (EF4 & STE)

    Καλησπέρα,

    κάνω την πρώτη μου προσπάθεια να δημιουργήσω ένα έργο με Entity Framework 4 και Self Tracking Entities.

    Όλα λειτουργούν κανονικά, το πρόβλημα μου όμως είναι ότι το Entity Framework  δεν υποστηρίζει την μεταβολή του πρωτεύοντος  κλειδιού.

    Όπως βλέπετε παρακάτω στον κώδικα που δημιουργεί το Τ4 πρότυπο, η αλλαγή του προτεύοντος κλειδιού δεν επιτρέπετε όταν η εγγραφή

    παρακολουθείται για αλλαγές και δεν είναι σε κατάσταση προς εισαγωγή.

        [DataContract(IsReference = true)]
        public partial class EcrDevice: IObjectWithChangeTracker, INotifyPropertyChanged
        {
            #region Primitive Properties
       
            [DataMember]
            public short Id
            {
                get { return _id; }
                set
                {
                    if (_id != value)
                    {
                        if (ChangeTracker.ChangeTrackingEnabled && ChangeTracker.State != ObjectState.Added)
                        {
                            throw new InvalidOperationException("The property 'Id' is part of the object's key and cannot be changed. Changes to key properties can only be made when the object is not being tracked or is in the Added state.");
                        }
                        _id = value;
                        OnPropertyChanged("Id");
                        }
                }
            }
            private short _id;

    Θα μπορούσε το ΕF να κρατάει την τιμή του προτεύοντος κλειδιού εσωτερικά της τάξης και να κάνει μια απλή ενημέρωση όπως παρακάτω

    Update EcrDevice SET EcrDevice.Id=@IdEcrDevice.Port=@PortNumber where EcrDevice.Id=@PreviousId

    Σκέφτομαι πως θα μπορούσα να κάνω χρήση Stored Proc με το EF για την ενημέρωση, αλλά δεν μου αρέσει αυτή η  προσέγγιση

    Κάθε βοήθεια για κάποιο Workaround είναι ευπρόσδεκτη

    Θα ήθελα να μην μπούμε στην διαδικασία να εξηγήσουμε γιατί μία εγγραφή χαρακτηρίζεται μοναδικά από το πρωτεύον  κλειδι και δεν πρέπει να μπορούμε να το μεταβάλουμε.

    Σας ευχαριστώ !

     


    Μπλουγουράς Γιάννης
    Wizcom O.E.
  •  17-08-2010, 12:23 59676 σε απάντηση της 59674

    Απ: The property 'Id' is part of the object's key and cannot be changed. (EF4 & STE)

    Καλησπέρα,

    Καταλαβαίνω το πρόβλημα, αλλά δεν νομίζω ότι υπάρχει workaround - η μηχανή του EF είναι "στημένη" να κάνει track τα entities με το primary key. Δεν νομίζω ότι θα μπορέσεις να κάνεις αλλαγές σε primary key - έστω και να αλλάξεις το template με τον κώδικα που το αποτρέπει - και να συνεχίσει το EF να μπορεί να κάνει track το entity.

    Προσωπικά, θα ήμουν υπέρ του ο μηχανισμός που θα αλλάζει το primary key να είναι εκτός του EF - η store procedure φαίνεται καλή ιδέα, αλλά θα πρέπει να προσέχεις το entity να μην είναι στην μνήμη. Εναλακτικά, θα πρέπει να "κοροϊδέψεις", δειχνοντάς του μια άλλη ιδιότητα σαν primary key - κάτι τύπου auto-number - και να έχεις πλήρη έλεγχο της ιδιότητας που θα είναι το "πραγματικό" primary key στο κώδικά σου.

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  17-08-2010, 13:33 59678 σε απάντηση της 59676

    Απ: The property 'Id' is part of the object's key and cannot be changed. (EF4 & STE)

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

    συμφωνώ με <<Προσωπικά, θα ήμουν υπέρ του ο μηχανισμός που θα αλλάζει το primary key να είναι εκτός του EF>>.
    θα το προσπαθήσω, μου φαίνετε ότι είναι πιο απλό να γράψω ένα update query με plain ADO .net command, και να παρακάμψω τελίως το EF.

    Και πάλι ευχαριστώ για την απάντηση!


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