Vielen Dank für die interessante Antwort! Sie hat mir sehr geholfen!
Die Lösung aus dem Link habe ich noch nicht getestet. Sieht aber sehr vielversprechend aus.
Der einfache Ansatz, über alle Items zu iterieren, funktioniert jedenfalls grundsätzlich. Ich habe derzeit noch ein paar Probleme im Detail, aber die bekomme ich hoffentlich noch in den Griff.
Danke!
Ich entwickle eine WPF Anwendung und habe folgende Problematik:
Beim Klick auf OK soll vor dem Speichern geprüft werden, ob irgendwo fehlerhafte Felder existieren. Wenn ja, dann soll das ERSTE fehlerhafte Feld fokussiert werden. Das bekomme ich mit Hilfe des VisualTreeHelpers hin - aber nur, wenn ich keine TabControls o. ä. habe...
Wenn ich z. B. auf der dritten Registerkarte stehe, und auf der Ersten noch ein fehlerhaftes Feld ist (das kann leider vorkommen und ist so gewünscht!), dann muss ich auch die Felder auf der ersten Registerkarte einbeziehen und ggf. den Fokus dorthin setzen.
In diesem Zustand (Tab3 aktiviert) sehe ich aber nur die Controls des 3. TabItem im VisualTree. Auch der LogicalTreeHelper konnte mir nicht helfen.
Wie kann man hier vorgehen?
Ok, danke! Ich hatte gedacht, dass ein Gedanke hinter dem MVVM Konzept der ist, dass man die UI-Technologie austauschen kann - sofern sie Datenbindung unterstützt.
Wenn in diesem Konzept die für mich "UI-unabhängige" Komponente (ViewModel) nur UI-abhängig implementiert werden kann, dann habe ich das Pattern in dieser Hinsicht bisher falsch verstanden. Dann ergibt es Sinn, dass ICollectionView (u. ä.) in MVVM Artikeln verwendet werden.
Nicht die erhoffte Antwort - aber sie hilft. Danke! 😃
Ich möchte gerne ein ViewModel erstellen, das potentiell später einmal in einer Cross-Plattform Anwendung eingesetzt werden kann.
Immer wieder stoße ich darauf, dass ich ICollectionView im ViewModel einsetzen kann. Ich habe noch keinen Artikel gesehen, der moniert, dass ICollectionView aus der Assembly WindowsBase stammt. Wenn ich den Sinn von MVVM richtig verstehe, dann sollte das ViewModel nicht von Windows-Komponenten abhängig sein.
Gibt es eine bessere Möglichkeit, um Dinge wie Sortierung und Filterung von Listen in den Griff zu bekommen? Oder sehe ich das zu eng? Ist MVVM eigentlich für Windows konzipiert?
Aber trotzdem verstehe ich nicht, wie andere das mit einem normalen Web-Hosting Paket machen!? Das sind doch Grundlagen, die in jeder Web-Anwendung möglich sein müssen, oder?
Wenn Du Dir den Azure Preiskalkulator anschaust, dann siehst, dass ne Webseite mit ca. 8€ im Monat zu hosten ist.
Das hört sich gut an. Dann muss ich nochmal genauer gucken. Danke!
Ich habe leider keine Azure Umgebung. So wie ich das Preismodell verstehe, ist das glaube ich für mich überdimensioniert. Ich will lediglich eine Api für eine App anbieten, die nur wenige Nutzer nutzen werden (Vereins-App). Vor allem geht es mir auch darum, mich erstmal in das Thema einzufinden.
Das muss doch ein Standard-Problem sein, das jeder haben müsste, der so ein Webhosting-Paket verwendet, wie ich es tue. Oder ist es üblich die Secrets einfach in der Web.config o. ä. zu speichern (wie ich es in vielen Anfängertutorials gesehen habe)?
Hallo,
ich versuche eine Web-API in ASP.NET Core zu erstellen. Mache so etwas zum ersten Mal außerhalb meines localhosts. Grundsätzlich komme ich mit den Anleitungen von Microsoft ganz gut voran. Aber beim Thema Sicherheit weiß ich nicht, wie ich das in einer Hosting-Umgebung umsetze, die nicht komplett in meiner Hand ist (also kein VServer o. ä.). Ich nutze ein Webhosting-Paket von Centron (Economy).
Dier verlinkte Microsoft-Artikel gibt mir Informationen, wie ich in der Entwicklung vorgehe, aber nicht wie ich das in der Produktion mache. Und selbst wenn ich versuchen würde den Secret Manager zu verwenden - wie mache ich das auf einem Web-Server. Dort steht mir meines Wissens keine Kommandozeile oder Power Shell oder dergleichen zur Verfügung. Ich müsste ja irgendwie die secret.json ins Benutzerverzeichnis bekommen. Oder übersehe ich da etwas?
Mir fehlt da glaube ich der grundsätzliche Ansatz. Über jede Information oder gute Links (gerne in deutsch 😉) wäre ich dankbar.
Halleluja!
Ja, ich bin blind. Und dämlich!
Das einzige Detail, das ich hier nicht gepostet und auch die ganze Zeit nicht beachtet hatte war mein DbSet:
public DbSet<NachrichtMap> Nachrichten { get; set; }
Da muss natürlich die Entität als generischer Parameter verwendet werden:
public DbSet<Nachricht> Nachrichten { get; set; }
Dann klappt's auch problemlos! Das Schlimmste: Der Fehler stand tatsächlich korrekt in der Fehlermeldung "The entity type 'NachrichtMap'..."
Sorry!!!
Leider derselbe Fehler, wenn ich Deine Anregung richtig verstehe...
Durch ApplyConfiguration hatte ich ja dasselbe gemacht. Aber einen Versuch war's wert:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
////modelBuilder.ApplyConfiguration(new NachrichtMap());
//modelBuilder.ApplyConfigurationsFromAssembly(typeof(NachrichtMap).Assembly);
modelBuilder.Entity<Nachricht>()
.HasKey(x => x.Id);
}
verwendetes Datenbanksystem: SQL Server 2019
Ich möchte mit Hilfe der Entity Framework Tools aus meinem Model eine Datenbank erstellen lassen. Analog zu dieser Anleitung: https://docs.microsoft.com/de-de/ef/core/get-started/?tabs=visual-studio#create-the-database
Dabei erhalte ich bei der Ausführung des Befehls Add-Migration immer folgende Fehlermeldung:> Fehlermeldung:
The entity type 'NachrichtMap' requires a primary key to be defined. If you intended to use a keyless entity type call 'HasNoKey()'.
Ich kann sie mir nicht erklären. Habe mittlerweile alle anderen Entitäten und alle anderen Mappings aus meinem Projekt ausgeschlossen. Auch die Basisklasse Entity (mit der Id) habe ich entfernt, sodass ich nur noch folgende kleine Entität in meinem Projekt habe:
public class Nachricht //: Entity
{
public int Id { get; set; }
public DateTime Erstellungszeitpunkt { get; set; }
public string Ueberschrift { get; set; }
public string Text { get; set; }
}
Theoretisch sollte ein Mapping überflüssig sein. Habe es deshalb ohne Überschreibung der OnModelCreating versucht und auch mit Hilfe einer Mapping-Klasse:
public class NachrichtMap : IEntityTypeConfiguration<Nachricht>
{
public void Configure(EntityTypeBuilder<Nachricht> builder)
{
builder.HasKey(x => x.Id);
//builder.HasNoKey(); //führt zum selben Fehler!
}
}
In meinem Context:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//modelBuilder.ApplyConfiguration(new NachrichtMap()); //funktioniert auch nicht
modelBuilder.ApplyConfigurationsFromAssembly(typeof(NachrichtMap).Assembly);
}
Ich bin ratlos. Habe schon Visual Studio neu gestartet, einen Rebuild durchgeführt, sogar ein neues Projekt erstellt und dort dasselbe nochmal gemacht.
Bin ich blind? Oder ist da irgendwo ein Bug im Migrationstool?
Dann sollte die Nachricht
> passend sein (vorher
> aufrufen). Für C# selbstverständlich mittels P/Invoke:
> .
Die Google-Suche nach Deinen Stichworten hat mich zu diesem schönen Event gebracht:
SystemEvents.SessionSwitch += OnSessionSwitch
Ich glaube in diesem Evenhandler kann ich alles machen, was ich möchte.
Danke für Eure Hilfe!
OK, das bringt mich schon einmal ein gutes Stück weiter. Aber damit kann ich lediglich prüfen wer angemeldet ist. Ich könnte in kurzen Abständen prüfen, ob sich etwas geändert hat. Wäre denkbar, aber irgendwie fühlt sich das nicht gut an. Oder übersehe ich etwas?
Eigentlich war ich auf der Suche nach einem Event auf das ich reagieren kann. Gibt es dahingehend etwas?
Ich habe für meine Software die Anforderung, dass sie bei Aufschaltung einer Remote-Desktop-Verbindung in die laufende Sitzung (s. g. Änderung des Remote-Control-Modus) gesperrt wird (eine erneute Eingabe des Passworts wird verlangt).
Ich finde keinen Ansatz, wie ich feststellen kann, ob sich jemand Remote aufgeschaltet hat. Kann mir jemand einen Tipp geben?
Wenn du - wie im ersten Kommentar - selber eine Datei verschlüsselst, was machst du mit dem Schlüssel für die Datei?
Das verschiebt dein Problem nur ein Stückchen weiter.
Aber wie löst man dann so eine Aufgabe sinnvoll?
Ich lasse ja genau deshalb den Schlüssel vom Benutzer eingeben (sein Passwort). Und nach allem was ich gelesen habe, sollte eine Passwortverschlüsselung z. B. mit Argon2 nicht mehr entschlüsselbar sein (mit aktuellen Mitteln).
Und ob ich es selber verschlüsselt ablege, oder von Windows verwalten lasse, ist dann theoretisch egal. Die Credential Manager-Lösung hätte allerdings einige Vorteile, weshalb ich diese favorisieren würde.
--
Und wegen des Passworts im Speicher: Gibt es eine empfohlene Vorgehensweise? Irgendwie muss ich es ja zwischenzeitlich halten.
Warum das mal funktioniert und mal nicht, kann ich dir leider nicht sagen.
Aber ich habe in den Visual Studio Optionen unter "Text-Editor" - "Allgemein" eine Checkbox gefunden, die dir helfen könnte: "Beim Kopieren/Ausschneiden Richt-Text kopieren".
Wenn diese Checkbox aktiviert ist, wird die Formatierung nach Word übernommen.
Nochmal interessehalber:
OK, vielen Dank euch beiden! Das sieht gut aus. 😃
Allerdings hatte ich meine Anwendung mit .NET Core erstellt. Das NuGet Paket sieht älter aus. Kennt jemand ein Paket für .NET Core?
Ansonsten muss ich mir den Quellcode herunterladen und versuchen ihn auf .NET Core bzw. Standard zu konvertieren...
Ich bin nicht sicher, ob das richtig rüber kam. Das Programm soll eine Windows 10 Desktop Anwendung sein. Deine Antwort bringt mich leider nicht wirklich weiter...
Hallo!
Ich möchte einen TOTP Generator für Windows erstellen (im Prinzip genauso wie die Android App "Google Authenticator").
Grundsätzlich habe ich das hinbekommen. Meine Frage ist, wie kann ich die Schlüssel, die ich für die Generierung der Einmalpasswörter benötige, sicher speichern?
Aktuell habe ich es so gelöst, dass ich sie mit AES verschlüsselt in eine Textdatei schreibe.
Aber wie lege ich den Schlüssel für die AES-Verschlüsselung sicher ab? Nach etwas Recherche schien mir der einizig sichere Weg die Vergabe eines Passworts durch den Nutzer selber zu sein. Also vergibt der Nutzer nun beim erstmaligen Start ein Passwort, ich speichere den mit Argon2 verschlüsselten Hashwert des Passworts in einer Textdatei ab und lasse den Benutzer bei jedem Programmstart das Passwort neu eingeben.
Das Passwort muss ich allerdings jeweils im Speicher halten, weil ich es ja für die AES-Verschlüsselung benötige.
Fragen:
Eigentlich könnt ihr euch den ganzen Aufwand mit dem Update-Vor-Delete doch sparen, wenn ihr einen Delete-Trigger auf den Tabellen erstellt.
...
Das Problem ist, dass ich nicht weiß wer die Änderung durchgeführt hat, da der angemeldete DB-Nutzer ein technischer Nutzer ist. Deshalb benötige ich die Information aus der Spalte "NutzerLetzteAenderung", die mir den Bezug zum tatsächlichen Nutzer liefert. Und diese Information bekomme ich m. E. nur indem ich sie per Update vor dem Löschen in die Tabelle schreibe.
OK, ich habe hier hausintern nochmal über die Möglichkeit diskutiert, die Protokollierung komplett in die Anwendung zu verlagern. Das scheint nicht diskutabel zu sein. Eure Argumente sind sicherlich sinnvoll. Aber es müssten sehr viele Prozesse geändert werden, damit wir wirklich sagen könnten, dass jede Änderung auch ohne Trigger zuverlässig protokolliert wird.
Momentan habe ich deshalb keine andere Idee, als beim Löschen einfach aus der Anwendung heraus einen zusätzlichen Protokolldatensatz zu schreiben. Dann hätten wir bei jedem Löschen 2 Datensätze in der Protokolltabelle. Gefällt mir gar nicht, aber etwas anderes fällt mir nicht mehr ein.
Vielen Dank für Eure Antworten!
Wird dort dann der Trigger ausgelöst, der einen Eintrag in eine History Tabelle schreibt oder was macht der Trigger?
Genau!
Ich würde für solch eine Nachverfolgung direkt im Code einen Eintrag in eine History Tabelle mit gleichem Aufbau eintragen, egal bei welcher Operation.
Dies würde ich aber nicht über einen Trigger lösen, sondern direkt im Code abbilden.
Der Gedanke war, dass ein Datenbank-Trigger auch Änderungen protokolliert, die direkt auf der Datenbank erfolgen, damit auch dort niemand etwas unbemerkt manipullieren kann.
Dazu wird in der Protokolltabelle der Datenbank-User, der die Änderungen durchgeführt hat, mit protokolliert. Leider benutzen wir in der Anwendung technische User. Deshalb haben wir uns dieses Workarounds mit der zusätzlichen Spalte "NutzerLetzteAenderung" bedient, der uns mitteilt wer die Änderung durchgeführt hat.
Ich versteh allein den Mehrwert nicht, wenn man nicht alle historischen Vorgänge hat im Sinne eines Audits, sondern nur den letzten.
Die Trigger protokollieren jede Änderung in der Protokolltabelle. Die Spalte "NutzerLetzteAenderung" hilft uns lediglich die Information aus dem Programm in die Protokolltabelle zu transportieren.
Haltet ihr es für irrelevant die Änderungen, die direkt auf der Datenbank stattfinden, zu protokollieren? Das ist etwas, was bei uns bisher nicht diskutabel war. Aber vielleicht habt ihr ja gute Argumente... 😉
Ansonsten noch eine andere Idee: Der Trigger protokolliert ja, wie gesagt, auch den angemeldeten DB-Nutzer. Kann man bei der Anmeldung an den SQL Server irgendwelche Metadaten aus dem Programm mitgeben, die der Trigger auslesen könnte. Dann könnte ich ggf. hierüber den tatsächlichen Nutzernamen mitgeben.
Und einen "Schalter", der Entity Framework dazu bringt, auch unnötige Updates durchzuführen, gibt es definitiv nicht?
verwendetes Datenbanksystem: SQL Server 2008 R2 über Entity Framework 6.1
Hintergrund:
Wir möchten protokollieren, welcher Benutzer eine Änderung an einer Tabelle durchgeführt hat.
Dazu besitzen unsere Tabellen ein Feld "NutzerLetzteAenderung" in die die Id aus der Nutzertabelle eingetragen wird.
Alle Tabellen besitzen zudem einen Trigger, der diesen Wert benutzt, um nach jeder Änderung in einer Protokolltabelle festzuhalten, welcher Benutzer wann etwas geändert hat.
Ist vielleicht nicht die eleganteste Lösung, funktioniert aber so weit ganz gut.
Problem:
Beim Löschen steht natürlich nicht der Benutzer in der Tabelle, der das Löschen ausgelöst hat, sondern der, der zuletzt etwas an dem Datensatz geändert hat.
Das Setzen der NutzerId in das Feld "NutzerLetzteAenderung" erfolgt vor dem SaveChanges des DbContexts. An dieser Stelle wollte ich vor dem Löschen ein Update auf den Datensatz einfügen (siehe Code). Leider optimiert EF offensichtlich die Operationen, sodass das "überflüssige" Update nicht ausgeführt wird.
Wichtige Zusatzinfo: Es existiert eine Transaktion, die die Änderungen mit einem Commit abschließt.
Frage: Ist es möglich EF dazu zu bringen, das Update vor dem Delete auszuführen?
Hier der Code, wie er aktuell aussieht:
private void SetUserIdAndPerformUpdateBeforeDelete(DbContext dbContext)
{
IList<DbEntityEntry> deletedEntities = dbContext.ChangeTracker.Entries()
.Where(e => e.Entity is IUserEditableEntity && e.State == EntityState.Deleted)
.ToList();
if (deletedEntities.Any())
{
foreach (var entry in deletedEntities)
{
entry.State = EntityState.Modified;
((IUserEditableEntity) entry.Entity).NutzerLetzteAenderungId = _auditSessionData.UserId;
}
dbContext.SaveChanges();
foreach (var entry in deletedEntities)
{
entry.State = EntityState.Deleted;
}
dbContext.SaveChanges();
}
}
Bei mir wird dafür eine Console aufgerufen die das Umsetzt und sich danach gleich wieder schließt...
Ja, ich schätze dass mein Problem irgendwie mit dem Databinding von WPF zusammenhängt. Danke für die Info!
Weitere Tests waren auch erfolgreich. Vielen Dank muhtanten!!
Vielen Dank für Eure Antworten!
Die Lösung mit "SetForegroundWindow" scheint (nach einem ersten Test) funktionieren zu können. Ich werde das nun weiter testen.
@ThomasE: Welche Office Bibliothek meinst Du? Ich hatte Microsoft.Office.Interop.Word verwendet. Damit hatte ich die Probleme. Meintest du eine andere?
Die Hinweise in dem stackoverflow Beitrag haben mich leider nicht weitergebracht...
Der Code insgesamt ist etwas schwierig hier darzustellen, da mehrere Klassen beteiligt sind. Interessant ist vielleicht der Kontext:
Es handelt sich um eine WPF Anwendung. Beim Klick auf einen Button wird die Execute-Methode eines über DataBinding angebundenen ICommands im ViewModel aufgerufen. Darin erfolgen mehrere asynchronerAufrufe (mit await). Am Ende der Methode wird als letzte Anweisung Word aktiviert.
Kann es sein, dass das Programm durch das DataBinding oder durch einen asynchronen Aufruf den Fokus nach der Aktivierung von Word zurückerhält?
Hier doch mal der Code der Execute Methode, wie er sinngemäß aussieht:
public async void OpenWordDocumentExecute()
{
var wordDocument = await LoadWordDocumentAsync();
var seriendruckfelder = await LoadSeriendruckfelderAsync();
SetSeriendruckfelder(wordDocument, seriendruckfelder);
ActivateWord(wordDocument.Application);
}
private static void ActivateWord(Application wordApplication)
{
wordApplication.Visible = true;
wordApplication.ActiveDocument.Activate(); //Vorschlag Stackoverflow
wordApplication.Activate();
}
Hallo zusammen,
Ich verzweifle an einem merkwürdigen Problem:
Ich öffne Word aus meiner Anwendung heraus, setze für die WordApplication Visible auf true und rufe Activate() auf. Word öffnet sich bisher zuverlässig im Vordergrund, wenn ich das Programm aus dem Visual Studio heraus starte.
Wenn ich aber die exe starte, und aus meinem Programm heraus Word öffne, öffnet es sich (offenbar standardmäßig) im Hintergrund. Wenn Word einmal den Dreh bekommen hat, sich auf dem Rechner im Vordergrund zu öffnen, dann öffnet es sich offensichtlich auch in der exe zuverlässig für längere Zeit (!?) immer wieder im Vordergrund. Bis es irgendwann wieder nicht mehr funktioniert.
Auf Rechnern auf denen ich nie debugge (sprich beim Kunden), schaffe ich es also nie Word im Vordergrund zu öffnen.
Hat jemand irgendeine Idee woran das liegen kann?
Hallo!
Ich möchte ein Seriendruck Word Dokument erstellen und die Datenquelle als Objekt an das Dokument übergeben. Geht so etwas? Wenn ja, wie? Oder muss die Datenquelle immer eine physisch existierende Datei sein?
VG, Paschulke
Welchen Lifestyle hat das Objekt?
Transient
Das Feld ist private - sogar private readonly. Aber es wird aber außerhalb (vom IoC Container) erzeugt und über den Konstrukor in meine Klasse hineingereicht.
Ich hatte CA1001 so verstanden, dass die Codeanalyse (VS) immer warnt, wenn ein Feld disposable ist - unabhängig davon wer das Feld erstellt. Offensichtlich ist das nicht so. Das new ist entscheidend.
Dann muss ich mal in der Doku von Castle nachlesen, ob ich mich um das Dispose kümmern muss.
Vielen Dank, Abt für Deine Hilfe!
Grundsätzlich sieht mein Code schon so aus, wie Deiner. Ich habe mich etwas missverständlich ausgedrückt. Natürlich hat die Klasse, die IDisposable implementiert eine Dispose Methode. Ich meinte die Klasse, die ein Feld vom Typ des IDisposables besitzt, hat keine Dispose Methode...
Warnt die Codeanalyse nur, wenn das Feld innerhalb der Klasse erstellt wurde?
Ich fürchte das Problem liegt darin, dass ich einen IoC Container (Castle Windsor) verwende, der mir das zu disposende Objekt über Constructor Injection in meine Klasse hinein reicht. Der IoC Container erstellt dabei das Objekt. Ist er evtl. so schlau das Objekt bei Zeiten auch zu disposen, sodass ich mich gar nicht darum zu kümmern brauche? Dann wäre ja tatsächlich alles in Ordnung.
Hallo!
Ich bin irritiert über die statische Codanalyse:
Ich habe eine Klasse, die ein privates Feld besitzt, das IDisposable implementiert. Die Klasse selber besitzt zurzeit keine Dispose-Methode. Wenn ich CA1001 Types that own disposable fields should be disposable richtig verstehe, sollte die statische Codeanalyse nun diese Warnung bringen, wenn ich sie laufen lasse. Tut sie aber nicht. Lt. Codeanalyse ist mein Code in Ordnung.
Verstehe ich die Regel falsch? Oder gibt es Konstellationen in denen die statische Codeanalyse den Fehler nicht erkennt?
Oh je... Asche auf mein Haupt!
Ich habe jetzt 2 Tage mit diesem Problem verbracht. Der schlichte, blöde Fehler war einfach nur, dass ich vergessen hatte den Rückgabewert zuzuweisen. Wie blind kann man sein...! Vor allem nachdem ich den Code noch einmal vereinfacht (das war hier mein Fehler!) hier rein gesetzt hatte...
Ich hatte also sinngemäß anstatt...
catch
{
myObject = await db.ReadMyObjectAsync().ConfigureAwait(false);
}
return myObject;
einfach nur...
catch
{
await db.ReadMyObjectAsync().ConfigureAwait(false);
}
return myObject;
geschrieben.
Wenn es hier eine Kaffeekasse für Dämlichkeit gäbe würde ich jetzt einen 5er rein schmeißen!
Sorry für die falsch gestellte Frage!!! Aber Eure Beiträge (vor allem der Beispielcode) haben mir trotzdem sehr geholfen. Einfach um einen anderen Blick auf das Problem zu bekommen...
Hallo!
Ich habe eine Methode zum Laden eines Objekts, die asynchron aufgerufen werden soll.
Darin wird zunächst versucht das zu ladende Objekt aus einer Datei zu deserialisieren. Wenn das fehlschlägt, soll das Objekt aus einer Datenbank gelesen werden.
Hier mal ein auf die wesentlichen Aspekte rediziertes Beispiel:
public void Main()
{
MyObject myObject = LoadMyObjectAsync().Result();
// myObject ist null, wenn der Code durch den catch-Block läuft.
}
private async Task<MyObject> LoadMyObjectAsync()
{
try
{
return await DeserialzeMyObjectAsync().ConfigureAwait(false);
}
catch (SerializationException)
{
return await db.ReadMyObjectAsync().ConfigureAwait(false);
}
}
Stellt mal außer Frage, ob das Beispiel in der Form Sinn macht. Mir geht es darum, die Technik zu verstehen...
Ich habe festgestellt, dass innerhalb der Methode DeserialzeMyObjectAsync ein Thread erzeugt wird, der geschlossen wird, wenn der Code seinen erwarteten Weg geht. Wenn der Code in die Exception läuft, bleibt der Thread auch nach der Rückkehr in die wartende Methode bestehen. Deshalb ist myObject im aufrufenden Thread null.
Wie fange ich innerhalb der Methode "LoadMyObjectAsync" den Fehler korrekt ab? Bzw. wie fahre ich im ExceptionHandler korrekt fort?
Vielen Dank für die Ideen 😃
Ich werde mir das morgen in Ruhe ansehen.
verwendetes Datenbanksystem: SQL Server 2008 R2
Hallo,
in meiner Datenbank habe ich mehrere Benutzer mit unterschiedlichen Rechten.
Ich habe eine Anforderung, dass ein Benutzer einen Datensatz auf den er Rechte besitzt, ändern muss. Gleichzeitig muss jedoch ein "techischer" Mechanismus ablaufen, der dafür sorgt, dass eine technische Spalte in mehreren Datensätzen derselben Tabelle geändert wird. Der angemeldete Benutzer hat jedoch u. U. kein Recht darauf, diese Datensätze zu lesen oder zu bearbeiten.
Die Idee ist nun, diese technische Anpassung durch einen technischen Benutzer durchzuführen. In 2 unterschiedlichen Transaktionen ist dies auch möglich. Gibt es eine Möglichkeit, eine Transaktion über 2 unterschiedliche Connections durchzuführen?
VG, Paschulke
Danke für den Vorschlag! Ich habe mir gerade mal ein paar Demos dazu angesehen. Das scheint leider auch nichts zu sein, um einen unbedarften Anwender damit arbeiten zu lassen.
So etwas ist evtl. eine Lösung, um in einer späteren Ausbaustufe ein Produkt für "Experten"-Benutzer anzubieten.
Ich glaube ein externes Tool kommt nicht in Frage. Ich wollte das im Grunde nur noch einmal bestätigt haben 😉
Hat jemand vielleicht noch eine Idee zu meiner zweiten Frage?
Hallo,
ich habe mal eine grundlegende Frage:
Hintergrund (die wichtigsten Anforderungen):
Fragen:
Ich würde mich freuen, wenn Ihr mir ein paar Tipps geben könntet.
VG, Paschulke
Vielen Dank für die interessanten Antworten!
Ich werde sie mir in Ruhe ansehen. Ich denke sie bringen mich ein großes Stück weiter 😃
Hallo,
die asynchrone Programmierung bereitet mir Probleme. Irgendwie läuft mein (WPF) Programm, dann rausche ich aber immer wieder in Probleme mit der Aktualisierung der GUI, da ich mich plötzlich mal wieder nicht im STA Thread befinde.
Ich fürchte, dass ich auf einem gefährlichen Halbwissen entwickle...
Meine erste Frage:
Wenn ich mit Hilfe von Task.Factory.StartNew einen neuen asynchronen Prozess starte, wird dann immer ein neuer Thread erzeugt? Irgendein "Experte" hatte mir mal erklärt, dass asynchron nicht gleich multithreaded ist und es wichtig ist, das zu verstehen. Offensichtlich habe ich es nicht verstanden. Kann mir das nochmal jemand erklären - sofern die Aussage stimmt?
Zweitens:
Wenn ich mit await auf die Fertigstellung eines asynchronen Prozesses warte, kehre ich dann immer in den aufrufenden Thread zurück? Davon bin ich bisher ausgegangen.
Drittens (erledigt sich evtl. mit Frage 1):
Besteht ein Unterschied zwischen einem asynchronen Prozess aus dem .NET-Framework (z.B. Stream.ReadAsync) und einem von mir erzeugten Prozess mit Task.Factory.StartNew?
Viertens:
Ich entwickle eine Client-Server-Application mit WPF und WCF. Die Erzeugung der Services übernimmt der IoC-Container Castle.Windsor. Um die Services asynchron aufzurufen nutze ich eine im folgenden Thread beschriebene Erweiterungsmethode: Stackoverflow (1. Antwort): Using Client-Side Task-Based Operations with WCFFacility in Castle.Windsor. Ist das sauber?
So das sollten erst einmal genug Fragen sein...
Alles was Du siehst steht in der Vorgangstabelle. Sie ist eine Tabelle, die redundante Daten der Detailtabellen enthält. Sinn der Vorgangstabelle ist wie gesagt ein performanter Aufbau des Vorgangsbaums.
Erst beim Doppelklick auf einen Eintrag (z. B. 01.01.2008 - 14.01.2008) werden die Daten aus der Detailtabelle gelesen (also hier aus der Tabelle Fortbildung).
Ich schließe das Thema jetzt ab. Obwohl alles sehr konfus war, habe ich doch ein paar gute Ideen erhalten. Ich fürchte, dass ich Diräkt doch einmal gekränkt habe. Das war nicht meine Absicht. Sorry! Der Fehler lag wohl offensichtlich eindeutig an mir bzw. meiner schlechten Erklärung.
Vielen Dank für Eure Hilfe!
Wenn ich Dich jetzt richtig verstehe möchtest du eine View erstellen in der ich alle 90 Detailtabellen einbeziehe.
Technisch würde das sicherlich funktionieren. Aber ist das performant? Ich hatte das bisher für so abwegig gehalten, dass ich nicht wirklich darüber nachgedacht hatte.
Aber vielleicht sollte ich das doch einmal tun... 😉
Der Thread ist langsam zu unübersichtlich. Spricht etwas dagegen, dass ich noch einmal von vorne anfange? Oder wird das hier nicht gerne gesehen?
Das Problem scheint zu sein, dass mein Problem falsch verstanden wird. Nicht die Detailtabellen haben eine 1:1 Beziehung zur Person sondern die Vorgangstabelle zu den Detailtabellen (und auch zur Personentabellen aber das ist ein Sonderfall, den ich erst einmal ausklammern würde)...
Ich würde versuchen aus meinen Beschreibungsfehlern zu lernen und in einem neuen Thread einen neuen Versuch starten. Wäre das ok?
Nein, sind sie nicht. Eine Person kann mehrere Adressen haben.
Jede Tabelle (also hier Person und Anschrift) hat eine 1:1 Beziehung zu einer "Vorgangstabelle"
Diese zwei Zitate wiedersprechen sich irgendwie ?!
Warum? 1 Person, n Detailtabelle und jede Detailtabelle hat 1 Vorgangsdatensatz.
Ich bin Dir dankbar für Deine Mühe, habe aber das Gefühl, dass Du Dich zu sehr auf einzelne Details fixierst und dabei nicht richtig versuchst, meine Beschreibung des fachlichen Zusammenhangs zu verstehen. Vielleicht würde es dann klarer. Nicht falsch verstehen! Ich bin dankbar für jeden, der sich die Mühe macht hier zu helfen. Ich habe nur das Gefühl wir drehen uns im Kreis...
Schau dir mal das EAV Datenbankmodell an. Damit kann man sowas von der Datenbank Seite her recht einfach abbilden, von der Reporting Seite her wird es allerdings komplizierter.
Bist du auf den SQL Server angewiesen, oder kannst du ggf. umstellen? Wenn ja, ist dies ein typischer Fall für NoSQL (z.B. MobgoDB).
Interessante Idee. Leider ist die Anwendung bereits zu groß und komplex um noch an den Fundamenten zu rütteln. Aber ich glaube EAV würde auch nicht in die richtige Richtung gehen, wenn ich es richtig verstehe. Es ist nicht nur ein Attribute-Value-Pair, das jeweils in einer Detailtabelle steht... Ich verfluche gerade meine angebrachten Beispiele 😉
Wie gesagt: In den meisten Fällen (mind. 80 der 90 Detailtabellen) geht es um die historische Speicherung von Anwendungsfällen zu einer Person. Von wann bis wann war sie krank. Hat sie Atteste zur Krankheit vorgelegt? Wann hat sie die Krankheit gemeldet?...
Soll nur ein Beispiel dafür sein, dass in den Detailtabellen richtig "Leben" steckt.
Ist die Konstellation wirklich so ungewöhnlich, dass ihr mich davon abbringen wollt? Ich hatte sie immer für vollkommen alltäglich gehalten. Wahrscheinlich war mein Beispiel einfach irreführend.
Wenn man sich nochmal die Problembeschreibung (mein 3. Beitrag hier) ansieht: Ist die Einführung einer 1:1 verknüpften Vorgangstabelle wirklich keine gute Idee?
Adressdaten und Kommunikationsdaten sind pro Person nur einmal vorhanden, und gehören daher in die Personentabelle.
Nein, sind sie nicht. Eine Person kann mehrere Adressen haben. Ich ahne worauf Du hinaus willst. Ich soll eine Spalte "Postanschrift", eine Spalte "Hausanschrift"... erstellen. Und eine Spalte "E-Mail", eine Spalte "Mobil" usw. Ok, bei diesen beiden Tabellen ginge das. Vielleicht waren sie als Beispiel nicht gut. Ich hatte sie gewählt, weil sie auch für nicht im der Fachlichkeit steckende Personen leicht verständlich sind. Dachte ich...
In den meisten Fällen geht es um solche Dinge wie Fortbildungen, Krankheiten usw. Sie haben i. d. R. ein Beginn und ein Ende und sind beliebig oft vorhanden. Ich kann sie nicht in die Personentabelle integrieren. Zumindest wüsste ich nicht wie...?
Eine 1:1-Beziehung in eine m:n-Beziehung umwandeln...? Klingt nicht gerade vernünftig. Aber ich muss zugeben, dass mir zumindest der Gedanke auch schon einmal kam... Sinnvoll ist das aber denke ich nicht.
Ich versuche einmal ganz grundsätzlich das Problem zu schildern:
Der Anwender wählt über eine Suchmaske eine Person aus. Es öffnet sich ein Fenster zur Bearbeitung dieser Person. Hier wird auf der linken Seite ein Vorgangsbaum angezeigt, der dem Benutzer die Möglichkeit gibt, Detaildaten zur gewählten Person zu berabeiten.
Das sieht in etwas wie folgt aus:
Nach diesem Beispiel gäbe es die Tabellen "Adresse", Kommunikation", "Dienstverhältnis", "Fortbildung". Jede Tabelle enthält also Detaildaten zu einer Person.
Insgesamt gibt es ca. 90 solcher Detailtabellen!
Wenn das Personenfenster geöffnet wird, muss der Vorgangsbaum erstellt werden. WIE?
Ich müsste jede Detailtabelle nach Einträgen zu der Person durchsuchen und die entsprechenden Daten zum Baum hinzufügen. Das ist erstens nicht performant und zweitens schlecht wartbar.
Deshalb die Idee eine "Vorgangstabelle" zu erstellen. Beim Speichern eines Datensatzes wird ein Eintrag in dieser Tabelle erzeugt. Wesentliche Spalten: PersId, Vorgangsbaumbeschriftung, IdentifierDerDetailtabelle
Ein Doppelklick auf einen Eintrag soll den Datensatz zur Bearbeitung öffnen. Deshalb müsste evtl. (falls EF das nicht anders liefert) die Id des "Stammdatensatzes" zusätzlich abgespeichert werden.
Macht das den Sinn vielleicht etwas deutlicher? Ich hoffe... 😉
... Ich habe eigentlich noch nie ein vernünftigen Grund gesehen, wesshalb man nicht gleich auf 1:1 Relations verzichtet und die Spalten direkt in die Tabelle packt ....
Genau diesen Kommentar hatte ich erwartet und deshalb den Sinn der Vorgangstabelle erläutert.
Wie baust Du dann den Vorgangsbaum performant und wartbar auf?
verwendetes Datenbanksystem: SQL Server
Hallo,
ich arbeite an einer Anwendung zur Verwaltung von Personendaten.
Zum Sinn der Vorgangstabelle:
Beim Öffnen einer Person soll ein "Vorgangsbaum" angezeigt werden, der dem Benutzer eine schnelle Übersicht der Daten zu dieser Person gibt. Aus diesem Grund haben wir die "Vorgangstabelle" erstellt, die im Wesentlichen aus der PersonId, und einer Caption für den Vorgangsbaum besteht. So kann der Baum mit einem Select auf einer Tabelle erzeugt werden. Ich muss allerdings über die Vorgangstabelle auch an die Id des verbundenen Datensatzes kommen, damit ein Doppelklick den Datensatz zur Bearbeitung öffnet. Das könnte mir denke ich das EF durch das Mapping liefern, oder?
Fragen:
Viele Grüße
Paschulke