none
Assoziationen in SqlCE RRS feed

  • Frage

  • Hallo allerseits,

    ich habe ein Problem mit einer Cached DB. Die Datenanbindung an die Datenbank habe ich mit SQLMetal als Code + Map erzeugt.
    In die Map habe ich anschließend fehlende Verknüpfungen eingefügt und entsprechende Member + EntityRefs/-Sets in einer separaten Quellcode Datei definiert.
    Das Einfügen von Datensätzen funktioniert mit InsertOnSubmit und anschließendem Aufruf von SubmitChanges. Der Aufruf erfolgt innerhalb eines TransactionScopes. Beim Aktualisieren einer Änderung (Db.GetChangeSet().Updates.Count()>0) wird eine ChangeConflictException mit Fehlermeldung Row not Found ausgelöst. Die Datenbank wird mit dem Startup Ereignis instanziert, und mit dem Exit Ereigniss freigegeben. Timestamps sind in den Tabellen vorhanden und mit IsVersion gekennzeichnet. Die Id und Timestampwerte sind auf CheckUpdate="Always" gesetzt.

                LibDB.Client.Vehicles tmp = null;
                try
                {
                    tmp = e.Parameter as LibDB.Client.Vehicles;
                    if (tmp == null) return;
                    if (!this._dc.Vehicles.Contains(tmp))
                    {
                        this._dc.Vehicles.Attach(tmp, this._dc.Vehicles.FirstOrDefault(v => v.Id == tmp.Id));
                    }
                    this.ShowChangesReport(this._dc.GetChangeSet());
                    using (TransactionScope ts = new TransactionScope())
                    {
                        try
                        {
                            this._dc.SubmitChanges();
                            ts.Complete();
                        }
                        catch (ChangeConflictException cce)
                        {
                            Console.WriteLine("Optimistic concurrency error.");
                            Console.WriteLine(cce.Message);
                            Console.ReadLine();
                            foreach (ObjectChangeConflict occ in this._dc.ChangeConflicts)
                            {
                                MetaTable metatable = this._dc.Mapping.GetTable(occ.Object.GetType());
                                LibDB.Client.Vehicles entityInConflict = (LibDB.Client.Vehicles)occ.Object;
                                Console.WriteLine("Table name: {0}", metatable.TableName);
                                Console.Write("Vin: ");
                                Console.WriteLine(entityInConflict.Vin);
                                foreach (MemberChangeConflict mcc in occ.MemberConflicts)
                                {
                                    object currVal = mcc.CurrentValue;
                                    object origVal = mcc.OriginalValue;
                                    object databaseVal = mcc.DatabaseValue;
                                    MemberInfo mi = mcc.Member;
                                    Console.WriteLine("Member: {0}", mi.Name);
                                    Console.WriteLine("current value: {0}", currVal);
                                    Console.WriteLine("original value: {0}", origVal);
                                    Console.WriteLine("database value: {0}", databaseVal);
                                }
                                throw cce;
                            }
                        }
                        catch (Exception ex)
                        {
                            this.ShowChangeConflicts(this._dc.ChangeConflicts);
                            Console.WriteLine(ex.Message);
                        }
                    }
                    this.ShowChangesReport(this._dc.GetChangeSet());
                }
                catch (NullReferenceException) { return; }
                catch (Exception ex) { MessageBox.Show(ex.Message, "Error"); }
                e.Handled = true;
    

     

    Als MemberChangeConflict wird die Tabellenspalte Created_at genannt, die drei Werte (aktuell, original und Datenbank) werden in dieser Spalte als identisch angezeigt. Der MemberChangeConflict existiert allerdings nur beim ersten Update Versuch nach dem initialen Hinzufügen eines Datensatzes.

    Meine Fragen dazu sind

    1. Ist es möglich den Fehler noch genauer zu lokalisieren ?
    2. Kann man in SQL CE Datenbanken überhaupt mit Assoziationen in externen Map Files arbeiten oder gibt's da Einschränkungen ?

    Danke!

    Mittwoch, 7. April 2010 08:29