Laden...
.
.tim myCSharp.de - Member
Softwareentwickler Mainz Dabei seit 21.12.2006 332 Beiträge
Benutzerbeschreibung

Forenbeiträge von .tim Ingesamt 332 Beiträge

20.03.2008 - 12:21 Uhr

Hallo, wie kann ich meiner Anwendung wieder den Focus geben?

Es ist Teilweise TopMost aber eine andere Anwendung holt sich in einem bestimmten Moment den Focus wieder (wann das ist, weiss ich aber).

Wie kann ich meiner Anwendung den Focus geben. Interessant wäre auch wie ich einer anderen Anwendung den Focus geben kann?

Vielen Dank
.tim

20.03.2008 - 12:04 Uhr

Bei 2.0 gibt es Styles?

Ich habe mal etwas aus der MSDN über FocusVisualStyle genutzt.

Durch das setzen des FocusVisualStyle kommt nur noch etwas dazu. Das Fade bei Vista bleibt trotzdem. Für das MouseOver suche ich auch noch was. Aber ich möchte das Style selber definieren und nicht erweitern.

Hat jemand eine Idee?

20.03.2008 - 10:57 Uhr

Hallo, ich habe einen Button.

Unter XP sieht der auch gut aus.

Unter Vista hingegen kommt ne tolle Fade Animation in der die Vordergrundfarbe auf Silber/Weiss wechselt. Wie kann ich das Deaktivieren oder die Ziel Farbe der Animation wechseln?

Vielen Dank
.tim

18.03.2008 - 15:51 Uhr

Super danke 🙂
Nicht wirklich so umständlich.
Habe leider nichts gefunden, dass anschliessend so unkompliziert funktioniert.

18.03.2008 - 15:10 Uhr

Das würde mich auch sehr interessieren.
Für mich ist es sehr wichtig, dass diese schwer manipulierbar sein stollte und das komplette System wiederspiegelt. D. h. beim Austausch einer Komponente sollte der Wert ein anderer sein.

Somit suche ich sowas wie System.GetHash() 😉

Ich denke bei dir liegt der Schwerpunkt dort auch oder?

18.03.2008 - 15:04 Uhr

Hallo, ich schildere erstmal was ich vorhabe, bzw. was ich umgesetzt habe.

Meine Anwendung hat verschiedene Bereiche, unterteilt in UserControls. Die UserControls werden bei Bedarf geswitched.

Nun nutze ich teilweise auch WPF in den UserControls. Früher hatte ich die UserControls bei Bedarf instanziiert und dargestellt.

Da das gesamte Instanziieren der WPF Controls teilweise mehrere Sekunden dauert, habe ich mich dafür entschieden, diese alle beim Programmstart zu instanziieren.

Da dies einpaar Sekunden dauert, möchte ich einen Splashscreen mit Statusanzeige in Form einer Progressbar anzeigen.

Jedem UserControl ist ein enum Wert zugeordnert. Damit kann ich relativ einfach eine UserControl Instanz beschreiben. Die Instanzen lieger in einer Liste vor, wobei der Listenindex dem int-Wert des enum-Werts entspricht.

Damit ich der Progressbar sagen kann, an welche Stelle er sich beim Instanziieren befindet, benötigte ich die Anzahl der enum-Werte.

Ich hoffe ihr versteht was ich meine.

Vielleicht habt ihr auch eine bessere Idee der Umsetzung.

13.03.2008 - 10:06 Uhr

@herbivore Ok ich danke dir für deine Hilfe.

Gibt es nicht ein Binding des Inhalts ohne Bindung des SelectedItems?
ich glaube nicht. Bin aber auch kein DataBinding-Spezialist.

herbivore

Wenn noch jemand dazu eine Idee etc. hat wäre ich sehr dankbar.

12.03.2008 - 17:32 Uhr

Mir ist folgendes Problem noch aufgefallen.

Ich habe zwei ComboBoxen. Wenn ich eine BindingList nutze, ist das SelectedItem der beiden ComboBoxen gleich.

Da das nicht sein soll, habe ich 2 BindingListen erstellt.
Jetzt sind sie zwar unabhängig, aber die Bindung existiert nicht.

Gibt es nicht ein Binding des Inhalts ohne Bindung des SelectedItems?

Ich habe halt eine Collection mit Objekten die in den ComboBoxen angezeigt werden. Nun soll zwar die Änderung in den ComboBoxen angezeigt werden, aber das SelectedItem soll nicht geändert werden.

12.03.2008 - 17:09 Uhr

Stimmt, seitens des OR-Mappers scheint es keine Änderungen zu geben.
Die BindingList bringt somit nur etwas wenn ich durch die Anwendung etwas ändere.

Was denkst du über das Problem, dass der OR-Mapper bestimmte Sachen nachläd wenn sie benötigt werden? --> "Lazy fetching"

Er scheint von der Klasse eine Proxy Klasse abzuleiten. Diese sind ja immer noch in der BindingList vorhanden.

Ich würde jetzt auf die Schnelle sagen, gibt kein Problem. Aber vielleicht fällt dir etwas ein.

Vielen Dank
.tim

12.03.2008 - 16:39 Uhr

Ich weiss nicht wie genau der OR Mapper die Eigenschaften füllt bzw. wie es mit der Aktualisierung aussieht.

Wenn ich mit MyListDB arbeite, habe ich zu jeder Zeit die "aktuelle" Version.

Nutze ich aber MyListPublic und würde nur Anfangs eine Kopie erstellen, hätte ich keine wirkliche Verbindung zu MyListDB.

Nehmen wir an ich habe eine Liste die als Eigenschaft auch eine Liste, bei der "Lazy fetching" aktiviert wäre. Dann könnte ich mir vorstellen, dass der OR Mapper Probleme hätte, die Collection bei der IBindingList nachzuladen.

Was denkst du?

12.03.2008 - 16:14 Uhr

ok, ersetzen wir object durch myClass 😉

Der Code existiert ja bereits ohne diese, nennen wir sie mal Zwischenschicht.

Siehst du dabei irgendwelche Probleme?

Ich sehe z. B. als erstes mögliches Problem, dass bei jedem Abholen der Eigenschaft eine Instanz erzeugt wird.

-> MyListPublic != MyListPublic

D. h. ich bin mir nicht sicher, ob ich dann MyListPublic genauso wie die alten Liste benutzen kann oder irgendwelche Einschränkungen entstehen.

Ich hoffe du verstehst was ich meine 🙂

12.03.2008 - 15:35 Uhr

Siehst du bei folgender Umsetzung ein Problem oder hast du es anders gemeint?

public virtual IList<object> MyListDB
        {
            get;
            set;
        }

        public virtual BindingList<object> MyListPublic
        {
            get
            {
                return new BindingList<object>(MyListDB);
            }
            set
            {
                MyListDB = value;
            }
        }

myListDB nutzt die Datenbank und an MyListPublic binde ich das Control.

12.03.2008 - 13:43 Uhr

Ich habe doch von der Datenbank ein Objekt das IList implementiert. Ich benötige aber ein Objekt das IBindingList implementiert. Dadurch habe ich doch 2 Objekte. Nun muss ich diese doch untereinnander abgleichen, da ich das IList Objekt nicht in ein IBindingList Objekt casten kann?

IBindingList implementiert zwar IList, aber nicht andersrum.

So wirklich verstehe ich das leider nicht.

12.03.2008 - 13:09 Uhr

Ok danke, leider ergibt sich dadurch eine riesige Änderung.

Ich müsste dauerhaft ein IList Objekt mit einem IBindingList Objekt abgleichen.
Woher soll ich z. B. wissen, dass sich die alte Liste (IList) geändert hat? Dann müsste ich bei dem IBindingList das richtige Event auslösen.

Das mit dem CurrencyManager verstehe ich nicht so ganz. Ich habe gedacht wenn ich eine Liste von Objekten habe und diese z. B. an ein Control binde, kann ich damit steuern an welches Objekt der Liste das Control gebunden ist.

11.03.2008 - 18:08 Uhr

Stimmt vielen Dank, daran habe ich leider garnicht gedacht.

Das Problem ist, ich bekomme vom OR Mapper (NHibernate) ein Objekt, dass IList<> implementiert, aber nicht IBindingList.

Jetzt kann ich ja nicht eine Klasse erstellen die IList und IBindingList implementiert und das Objekt aus der Datenbank in meine neue Klasse casten, nur weil sie beide IList implementieren.

Habe ich gerade einen Denkfehler? Wie soll ich vorgehen. Danke 🙂

11.03.2008 - 17:28 Uhr

Ok vielen danke. Sehe ich es richtig, dass ich den DataSource auf eine List<> mit Objekten die das INotifyPropertyChanged implementiert haben, setzen kann?

Bitte kurz bestätigen, damit ich mir sicher bin, dass ich es richtig verstanden habe 🙂

Danke.

11.03.2008 - 17:14 Uhr

Hallo herbivore,

danke INotifyPropertyChanged sagt mir etwas.

Sehe ich das richtig, dass die Controls auf das PropertyChanged Event der Items achtet und danach die Darstellung aktualisiert?

Es irritiert mich dabei aber das DataBinding.

Hast du ein kurzes Beispiel? Weil so ganz kann ich dir leider nicht folgen.

11.03.2008 - 16:55 Uhr

Hallo,

wenn ich eine Listbox, ComboBox etc. erstelle, wird für jedes Item die Rückgabe von ToString() dargestellt. Das ist auch gut so, damit kann ich die Darstellung kontrollieren.

Wenn ich nun ein Objekt ändere, wird die Methode ToString von dem Control nicht erneut aufgerufen.

Jetzt könnte ich das Objekt bzw. das Item entfernen und erneut einfügen.

Da dadurch der Fokus verloren geht und ich es als unsauber empfinde, frage ich mich, was eine saubere Möglichkeit wäre.

Wie geht ihr dabei vor?

10.03.2008 - 17:06 Uhr

Hallo ich nutze UserActivityHook und ein von Visual Studio gewrapptes COM Objekt.

Die Aktionen die ich im Com Objekt vornehme funktionieren normalerweise einwandfrei.

Nun möchte ich sie gerne bei einem GlobalHook aufrufen.

Dafür nutze ich das KeyDown Event von UserActivityHook und überprüfe die gedrückte Taste.

In meinem Fall bei Esc, wird der normalerweise einwandfrei Code ausgeführt.
Nun erhalte ich eine COMException mit der Beschreibung:

**Ein ausgehender Aufruf kann nicht ausgeführt werden, da die Anwendung einen eingabe-synchronisierten Aufruf weiterleitet.

HRESULT: 0x8001010D (RPC_E_CANTCALLOUT_ININPUTSYNCCALL)**

Leider sagt mir das garnichts. Kann mir jemand sagen was es bedeutet, bzw. wie ich es beheben kann.

Vielen Dank
.tim

06.03.2008 - 12:54 Uhr

Da ich vorerst eine Lösung benötige.

Habe ich einen neue Klasse mit SortNr und TVSender erstellt.

Diese Klasse repräsentiert somit die "Pseudotabelle". Wie es für so Zwischentabellen typisch ist, gibt es einen zusammengesetzten Key (ProfilId und SenderId)

In nHibernate habe ich dies mit "composite-id" umgesetzt. Das Problem ist nur bei der Definition der Senderliste im Profil. Dort muss ich nun den zusammengesetzten Key angeben. Da mir aber nur die ProfilId bekannt ist, funktioniert die Umsetzung so leider auch nicht.

Es ist schon schlimm, dass so ein scheinbar kleines Problem, so schlecht gelöst werden kann.

EDIT: Oder sollte man es eher so betrachten, dass es keinen (Primary)Key in der Tabelle gibt sondern nur 2 Fremdschlüssel. Aber wenn es keinen (Primary)Key gibt, kann keine Eindeutigkeit überprüft werden.

06.03.2008 - 12:42 Uhr

Ich würde es so lassen wie bisher.
Maximal würde ich für Zusatzinformationen eine neue Tabelle erstellen.

06.03.2008 - 11:02 Uhr

Danke, genau so sehe ich das auch.

Ich hatte zuerst an eine Art HashTable gedacht. Nach dem folgendem Prinzip:

Key = TVSender
Value = Zusatzdaten (SortNr etc)

Nur finde ich das nicht optimal. Wobei ich auch keine Idee für eine bessere Umsetzung habe.

Edit: Ausserdem wüsste ich auch nicht, wie ich sowas spezielles einem O/R Mapper beibringen soll 😉

06.03.2008 - 10:47 Uhr

verwendetes Datenbanksystem: MySQL
O/R Mapper: nHibernate

Hallo alle zusammen.

Ich bin mir nicht sicher wie ich folgendes sauber umsetzen kann und suche nach einer "So macht man es"-Lösung 🙂

Ich habe Profile und TVSender. Einem Profil kann n Sender beinhalten.

Wichtig ist dabei auch, an welcher Stelle "SortNr" der Sender in dem Profil steht. Diese Information gehört für mich in die Zwischentabelle. Datenbanktechnisch ist es kein Problem aber nun kommen die Objekte.

Über meinen O/R Mapper arbeite ich in dem Profil mit dem sogenannten many-to-many Element.

Dieser erstellt mir innerhalb des Profils eine Liste von TVSendern, was ja auch richtig ist. Was mache ich nun mit der "SortNr"? Wohin gehört dies logischerweise in der Objekthierarchie?

Ich hoffe auf eure Hilfe/Ideen.

Danke
.tim

03.03.2008 - 15:09 Uhr

Das ist sehr verrückt.

Folgende Zeile ist schuld 🙁
<timestamp name="UpdateDate" column="lastUpdateDate">

Wenn ich den Eintrag entferne funktioniert alles.

Jetzt frage ich euch: Was mache ich falsch? 🙁

Es wäre super wenn jemand eine Idee hätte und mir helfen könnte.

Vielen Dank.
Tim

03.03.2008 - 15:01 Uhr

Ok danke.

Typisch Microsoft: "Erzwungene Pseudo Sicherheit"

03.03.2008 - 14:34 Uhr

Hallo, danke.

Meine Software soll später ein normaler User benutzen können.

Gibt es eine Möglichkeit, dass der Anwendung vertraut wird.

Oder ähnlich Möglichkeiten wie z. B. das setuid Unix-Dateirecht.

Bei dem Framework 1 (1.1) und 2 habe ich unter Verwaltung die Möglichkeit Assembly Rechte zu verwalten. Wo befindet sich dies bei dem Framework 3.5? Muss man vielleicht ein manuell ein MMC SnapIn nachinstallieren?

29.02.2008 - 17:40 Uhr

Zwischenzeitlich habe ich auf Vista umgestellt. Dort bekomme ich nun eine SecurityException. Ich bin als Administrator eingelogt, wieso erscheint trotzdem die Fehlermeldung?

29.02.2008 - 17:28 Uhr

Ja ist es nicht komisch ich habe eine Kategorie und in deinem Fall eine Information.

Normalerweise würde ich denken man erstellt die Kategorie und fügt in die Kategorie Informationen, Fehler oder was auch immer hinzu.

Aber die Umsetzung ist anders.

Man überpüft ob die Information bzw. die Quelle bereits existiert. Ist das nicht der Fall wird die Quelle erzeugt ?! Wieso muss ich die Quelle erstellen?

Es ist somit auch nur möglich, dass die Quelle in einer Kategorie vorhanden sein kann.

Wieso ist die Kategorie an die Quelle gebunden?

29.02.2008 - 16:34 Uhr

Hat jemand ein Beispiel, dass eine Kategorie erstellt und dort etwas hineinschreibt.
Das Beispiele aus der MSDN verwirren mich.

29.02.2008 - 16:33 Uhr

Hat noch jemand eine Idee? Es ist sowas von komisch.

29.02.2008 - 10:19 Uhr

Die UserControls enthalten schon zur Designzeit den ElementHost und ein eingebundenes WPF Control.

Beim erstmaligem Zugriff auf ein Usercontrol mit ElementHost und WPF Control dauert das laden Teilweise bis zu 7 Sekunden. Anschliessend nur noch 1-3sek, was aber noch immer zu lange ist.

28.02.2008 - 15:27 Uhr

Danke, der Code wurde so ausgeführt wie ich ihn gepostet habe.

Das Ergebniss ist somit auch verständlich. Eine Transaktion ohne "Daten" wurde Commited und hatte ja nix mit der Singleton Session zu tun.

Ich nutze nun das Save der lokalen Session. Dort erscheint genau der bekannte Fehler. Somit besteht kein Unterschied.

28.02.2008 - 10:11 Uhr

Vielen Dank.

In der Datenbank sind keine Constraint vorhanden.

  1. Save funktioniert.
  2. Save funktioniert weiterhin. SaveOrUpdate erzeugt keinen Fehler mehr aber speichert den Eintrag auch nicht.

Den Code habe ich folgermaßen ersetzt:


private void checkAudioFolder(DirectoryInfo di, string rootPath, AudioCDHierarchie parent)
        {
            NHibernate.Cfg.Configuration configuration = new NHibernate.Cfg.Configuration();
            configuration.AddAssembly("SyniqStructs");
            NHibernate.ISessionFactory factory = configuration.BuildSessionFactory();
            NHibernate.ISession session = factory.OpenSession();

            var trans = session.BeginTransaction();
            AudioTrack at = new AudioTrack();
            at.TrackNr = 0;
            at.Artist = "";
            at.Genre = "";
            at.Year = 0;
            at.Checksum = "afdd4a92b19826790c83ad5822cded7f";
            at.ElementName = "ElementName";
            at.InsertDate = DateTime.Now;
            at.InsertState = 1;
            at.UpdateDate = at.InsertDate;
            at.Path = "pfad";
            //currentCD.AudioTracks.Add(at);
            //at.CD = currentCD;
            Singleton.DBSession.Session.SaveOrUpdate(at);
            //newAudioTracks++;
            trans.Commit();
            trans.Dispose();
        }
27.02.2008 - 17:07 Uhr

Danke, ich habe alles auseinnander genommen und wenn ich nun alleine folgenden Code ausführe. Wird die bekannte Fehlermeldung bei dem Commit geworfen.

var trans = Singleton.DBSession.Session.BeginTransaction();
AudioTrack at = new AudioTrack();
at.TrackNr = 0;
at.Artist = "";
at.Genre = "";
at.Year = 0;
at.Checksum = "afdd4a92b19826790c83ad5822cded7f";
at.ElementName = "ElementName";
at.InsertDate = DateTime.Now;
at.InsertState = 0;
at.UpdateDate = at.InsertDate;
at.Path = "pfad";
//currentCD.AudioTracks.Add(at);
//at.CD = currentCD;
Singleton.DBSession.Session.SaveOrUpdate(at);
//newAudioTracks++;
trans.Commit();
trans.Dispose();

Die XML sieht folgermaßen aus:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="SyniqStructs.BusinessObjects.AudioTrack, SyniqStructs" table="audiotracks">
<id name="Id" column="autoId" type="int">
<generator class="identity" />
</id>
<timestamp name="UpdateDate" column="lastUpdateDate" />
<property name="TrackNr" column="tracknr" type="int"/>
<property name="Artist" column="artist" type="string" />
<property name="ElementName" column="title" type="String"/>
<property name="Genre" column="genre" type="String" />
<!--<many-to-one name="CD" column="cd_id" class="SyniqStructs.BusinessObjects.AudioCD, SyniqStructs" />-->
<property name="Path" column="pfad" type="String"/>
<property name="Checksum" column="checksumme" type="String"/>
<property name="InsertDate" column="insertDate" type="DateTime"/>
<property name="InsertState" column="InsertState" type="Int32"/>
</class>
</hibernate-mapping>

Ich weiss nun echt nicht mehr an was es liegen kann. Vielleicht bin ich nach mehreren Stunden nun auch blind 😉

Hat jemand eine Idee?

Danke
Tim

27.02.2008 - 15:00 Uhr

Ok danke, werde es darüber probieren.

27.02.2008 - 11:52 Uhr

Hallo, ich benötige den Laufwerksnamen (wie der zB auch in dem Gerätemanager zu finden sind)

Die Methode System.IO.DriveInfo.GetDrives() liefert mir die logischen Laufwerke. Der Name entspricht in dem Fall leider dem Laufwerksbuchstaben.

Mir geht es aber um die pysikalischen Laufwerke bzw. nur um die CD (DVD/BlueRay) Laufwerke.

Davon benötige ich den Laufwerksbuchstaben, den Namen und die SPTI Id

Habt ihr eine Idee?

27.02.2008 - 10:26 Uhr

Soetwas in der Art muss ich wahrscheinlich auch machen. Mich würde aber auch interessieren ob bereits jemand vor so einem Problem stand und oder ob jemand eine gute Umsetzung dafür hat?

26.02.2008 - 18:01 Uhr

Hallo, ich habe ein Fenster in Widnows.Forms und dort werden je nach Aktion Controls (UserControls) geladen. Nun möchte ich gerne innerhalb der UserControls WPF Controls einbinden. Dies funktioniert zwar durch die Host Komponente, jedoch wird dadurch die "Umschaltzeit" um ca 1-3 Sekunden verlängert.

Habt ihr ähnliche Probleme bzw. soetwas gelöst?

Da ich nun Angst habe, dass dadurch ein beträchtlicher Mehraufwand entsteht, hoffe ich auf eure Ideen bzw. Erfahrungen.

Danke Tim

26.02.2008 - 17:09 Uhr

Danke für deine Mühe.

Die Transaktion wird vorher aufgerufen:

public void CheckFolder()
        {
            newVideos = 0;
            newAudioTracks = 0;

            var trans = Singleton.DBSession.Session.BeginTransaction();
            checkVideoFolders();
            checkAudioFolders();
            trans.Commit();
        }

        private void checkAudioFolders()
        {
            foreach (SupervisedAudioFolder f in saf)
            {
                checkAudioFolder(Directory.CreateDirectory(f.Folder), f.Folder, null);
            }
        }

Der Rollback existiert noch nicht, da die Sache erstmal den Normallfall überstehen muss.

Genau die Session ist ein Singleton.

Da die Methode CheckAudioFolder rekursiv aufgerufen wird und ich Fehler dadurch mehrfache Transaktionen verhindern möchte, läuft der komplette Prozess in einer Transaktion.

Dazu sollte ich vielleicht noch sagen, dass eine weitere Methode existiert, diese wird als neuer Thread aufgerufen:

public static void EndlessScan()
        {
            var fs = new FolderSupervisor();
                while (true)
                {
                    fs.CheckFolder();
                    System.Threading.Thread.Sleep(1000 * 60);
                }
        }

Zu dem letzten Punkt.

Die Namen sind nicht so gut gewählt. Die Überprüfung (liste.Count == 0) bezieht sich auf den Hierarchiepunkt der gesucht wird. Wenn keiner vorhanden ist wird er erstellt. Wenn ein parent der Methode übergeben wurde, wird der Punkt diesem parent hinzugefügt und das parent gespeichert. Ansonsten wird der neue Hierarchiepunkt gespeichert.

In der Version die ich gepostet habe, ist leider etwas durcheinnander geraten. Der Abschnitt muss folgendermaßen aussehen. Ich hoffe nun ist es für dich verständlich.

if (liste.Count == 0)
                {
                    newParent = new AudioCDHierarchie();
                    newParent.Path = d.FullName;
                    //var elemente = d.FullName.Remove(0, rootPath.Length).Trim('/', '\\').Split('\\', '/');

                    newParent.ElementName = d.GetLastDirectoryName();

                    newParent.InsertDate = DateTime.Now;
                    newParent.ImgPath = imgSearch(d);
                    if (parent != null)
                    {
                        parent.Childs.Add(newParent);
                        Singleton.DBSession.Session.SaveOrUpdate(parent);
                    }
                    else
                    {
                        Singleton.DBSession.Session.SaveOrUpdate(newParent);
                    }
                }

Ich finde aber einfach nichts, wieso der Code nicht funktioniert.

26.02.2008 - 10:23 Uhr

Ok vielen Dank. Hier ist der Codeausschnitt vorhanden. Die Zeile wo mitlerweile der Fehler auftritt ist im Code markiert.

Ich hoffe du findest etwas.

Vielen Dank
Tim

private void checkAudioFolder(DirectoryInfo di, string rootPath, AudioCDHierarchie parent)
        {
            AudioCDHierarchie newParent = null;
            AudioCD currentCD = null;

            foreach (var d in di.GetDirectories())
            {
                var liste = Singleton.DBSession.Session.CreateCriteria(typeof(SyniqStructs.BusinessObjects.AudioCDHierarchie))
                    .Add(Expression.Eq("Path", d.FullName))
                    .List<SyniqStructs.BusinessObjects.AudioCDHierarchie>();
                if (liste.Count == 0)
                {
                    newParent = new AudioCDHierarchie();
                    newParent.Path = d.FullName;
                    var elemente = d.FullName.Remove(0, rootPath.Length).Trim('/', '\\').Split('\\', '/');

                    newParent.ElementName = d.GetLastDirectoryName();

                    newParent.InsertDate = DateTime.Now;
                    newParent.ImgPath = imgSearch(d);
                    if (parent != null)
                    {
                        parent.Childs.Add(newParent);
                        Singleton.DBSession.Session.SaveOrUpdate(parent);
                    }
                    else
                    {
                        Singleton.DBSession.Session.SaveOrUpdate(newParent);
                    }
                }
                else
                {
                    newParent = liste[0];
                    if (newParent.ImgPath.Trim().Length == 0)
                    {
                        newParent.ImgPath = imgSearch(d);
                        Singleton.DBSession.Session.SaveOrUpdate(newParent);
                    }
                }
                checkAudioFolder(d, rootPath, newParent);
            }

            if (parent != null)
            {
                // Überprüfen ob die AudioCD schon existiert
// Hier entsteht die Exception: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) for SyniqStructs.BusinessObjects.AudioTrack instance with identifier: 0
                var cdliste = Singleton.DBSession.Session.CreateCriteria(typeof(SyniqStructs.BusinessObjects.AudioCD))
                    .Add(Expression.Eq("HierarchieParent", parent))
                    .SetMaxResults(1)
                    .List<SyniqStructs.BusinessObjects.AudioCD>();

                // Neue Audio CD anlegen
                if (cdliste.Count == 0)
                {
                    currentCD = new AudioCD();
                    currentCD.ElementName = parent.ElementName;
                    currentCD.HierarchieParent = parent;
                }
                else
                {
                    currentCD = cdliste[0];
                }
            
                {
                    Singleton.DBSession.Session.SaveOrUpdate(currentCD);
                }

                foreach (var f in di.GetFiles())
                {
                    if (f.Name.ToLower().EndsWith(".mp3") ||
                        f.Name.ToLower().EndsWith(".wma"))
                    {

                        if (!exists(typeof(AudioTrack), f))
                        {
                            AudioTrack at = new AudioTrack();
                            at.Checksum = Helper.MD5Helper.GetHashFromFile(f.FullName);
                            at.ElementName = f.Name;
                            at.InsertDate = DateTime.Now;
                            at.UpdateDate = at.InsertDate;
                            at.Path = f.FullName;
                            currentCD.AudioTracks.Add(at);
                            at.CD = currentCD;
                            Singleton.DBSession.Session.SaveOrUpdate(at);
                            newAudioTracks++;
                        }
                    }
                }

                if (newParent != null)
                {
                    Singleton.DBSession.Session.SaveOrUpdate(newParent);
                }

            }
        }
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
	<class name="SyniqStructs.BusinessObjects.AudioCD, SyniqStructs" table="audiocds">
		<id name="Id" column="cdid" type="int">
			<generator class="identity" />
		</id>
		<timestamp name="UpdateDate" column="lastUpdateDate" />
		<property name="ElementName" column="cdname" type="String"/>
		<property name="Year" column="year" type="int" />
		<property name="Genre" column="genre" type="String"/>
		<property name="Artist" column="artist" type="String" />
		<property name="InsertDate" column="insertDate" type="DateTime"/>
		<property name="DiscId" column="discid" type="String" />
		<bag name="AudioTracks" cascade="save-update">
			<key column="cd_id" />
			<one-to-many class="SyniqStructs.BusinessObjects.AudioTrack, SyniqStructs" />
		</bag>
		<many-to-one name="HierarchieParent" class="SyniqStructs.BusinessObjects.AudioCDHierarchie, SyniqStructs" column="hierarchieid"/>
	</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
	<class name="SyniqStructs.BusinessObjects.AudioTrack, SyniqStructs" table="audiotracks">
		<id name="Id" column="autoId" type="int" unsaved-value="0">
			<generator class="identity" />
		</id>
		<timestamp name="UpdateDate" column="lastUpdateDate" />
		<property name="TrackNr" column="tracknr" type="int"/>
		<property name="Artist" column="artist" type="string" />
		<property name="ElementName" column="title" type="String"/>
		<property name="Genre" column="genre" type="String" />
		<many-to-one name="CD" column="cd_id" class="SyniqStructs.BusinessObjects.AudioCD, SyniqStructs" not-found="ignore"/>
		<property name="Path" column="pfad" type="String"/>
		<property name="Checksum" column="checksumme" type="String"/>
		<property name="InsertDate" column="insertDate" type="DateTime"/>
		<property name="InsertState" column="InsertState" type="Int32"/>
	</class>
</hibernate-mapping>
25.02.2008 - 17:42 Uhr

Danke.

Ich verstehe darunter wenn inverse="true" gesetzt ist, wird die Collection nicht mit aktualisiert.

Wenn aber eine Bidirektionale Relation besteht, sollte doch in jedem Fall der Rest auch gespeichert werden.

D. h. beim speicheren der AudioCD, sollten auch die Änderungen in den AudioTracks (one-to-many) gespeichert werden. Wenn ich einen AudioTrack speichere soll die CD (property) auch gespeichert werden.

Für mich hört es sich so an, dass die Eigentschaft inverse das rekursive insert/update unterbricht.

Das erste Beispiel "NHibernate.Auction.Category" unter 6.8 ist sogar eine many-to-many Beziehung die selbst ohne inverse funktioniert.

Welche Probleme durch die zwei Versionen im Speicher auftreten wird leider nicht eingegangen.

Da für mich die Referenz vom Typ AudioCD in dem AudioTrack (property) unwichtiger ist, würde ich diesen gerne mit einem inverse="true" versehen.
Leider ist die Eigenschaft inverse in einem property tag nicht zulässig.

Die Erleuchtung ist mir leider nicht gekommen. Welche Instruktionen meinst du? Was empfehlst du mir?

25.02.2008 - 16:32 Uhr

Ich habe nun bei der Bag inverse="true" hinzugefügt. Leider tritt der Fehler noch immer auf.

Ich frage mich was die Transaktion mit einem Select zu tun hat.

25.02.2008 - 14:22 Uhr

Ja danke, genau das ist der Fall.

Es gibt AudioCD und AudioTrack.

Die AudioCD enthält ein Bag aus AudioTracks und der AudioTrack hat eine referenz auf die AudioCD.

Ist daran etwas falsch, bzw. das Problem?
Wie soll ich weiter vorgehen?

25.02.2008 - 12:41 Uhr

Ok danke.

Ich hole die Objekte so aus der Datenbank wie ich sie benötige. D.h. brauche ich einen oder mehrere Kunden hole ich mir diese aus der Datenbank.

Oder darf ich nur einmalig alle Kunden holen und darf nur daran arbeiten?

Für mich war der Gedanke "OR-Mapper gib mir Kunde XY" sehr interessant.

Im moment gehe ich auch so vor.

25.02.2008 - 11:14 Uhr

Ok ich habe nun alle Objekte vorher gespeichert.
Nun kommt aber ein anderer Fehler:


Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) for AudioTrack instance with identifier: 0

Die unsaved-value steht auf "0".

Das ist sehr komisch. Wenn ich vorher nicht speichere kommt es zu dem Fehler "save the transient instance" und wenn ich es speichere erscheint der Fehler "...Row was updated ... by another transaction..."

Wie soll ich dabei vorgehen? Was mache ich falsch?

22.02.2008 - 10:14 Uhr

Ich finde es sehr komisch, folgende Fehlermeldung wird bei dem folgenden Code geworfen.

object references an unsaved transient instance - save the transient instance before flushing: AudioCD


        private bool exists(Type t, FileInfo f)
        {
            var a = Convert.ToInt32(
                Singleton.DBSession.Session.CreateQuery("SELECT COUNT(*) FROM " + t.Name + " AS tab WHERE tab.Path = :path")
                //.SetString("tab", t.Name)
                .SetString("path", f.FullName)
                .List()[0]) > 0;

            return a;
}

Ich weiss echt nicht mehr weiter 🙁

18.02.2008 - 12:07 Uhr

@DaMoe80

Ich weiss leider nicht was das für Probleme sein können.

Die Sache mit dem Filter verstehe ich noch nicht so recht. collection brauch nicht initaliziert sein?

Ja ich muss nur wissen ob es einen Eintrag gibt der auf "Expression.Eq("Path", f.FullName)" passt.

18.02.2008 - 11:56 Uhr

Hallo, ich nutze auch eine statische Session. Somit kann ich das mit ausgelaufener Session ausschliessen.

18.02.2008 - 10:21 Uhr

Danke für die Antwort.

Leider verstehe ich es noch immer nicht.

Die Signatur ist doch:
EventLog.SourceExists(source)
EventLog.CreateEventSource(source, logname)