Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von sugar76
Thema: Anbieter für Code Signing gesucht
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Ok danke für die Info.

Zitat von Abt
Get a code signing certificate

Mir ist trotz Recherche nicht klar, ob ich ein Zertifikat mit Hardware-Token (EV) benötige oder ob ein "normales" Zertifikat ausreicht.

Wenn mich jemand aufklären könnte, wäre ich dankbar ...

Thema: Anbieter für Code Signing gesucht
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo,

ich will meine WPF-Anwendung signieren.

Ich finde allerdings den Markt für Anbieter von Code Signing Zertifikaten recht unübersichtlich und es gibt extreme Preisunterschiede.

Außerdem erfordert der Registrierungsprozess bei einigen Anbietern anscheinend den Gang zum Notar (siehe dieser Beitrag).

Kurz: ich blick da nicht ganz durch.

Kann jemand einen seriösen Anbieter empfehlen, der preislich OK ist und bei dem der Registrierungsprozess möglichst unkompliziert abläuft?

Gruß

Thema: Auf was soll ich von .NET 4.6.1 aus upgraden?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

ich arbeite an einer WPF-Anwendung, die aktuell unter .NET 4.6.1 läuft. Clients sind alle Windows 10.

Ich will nun die .NET Version im Rahmen eines Wartungsupdates aktualisieren.

Nun ist die Frage, ob ich auf .NET 4.8 oder auf .NET Core 3.1 aktualisiere.

Bei .NET 4.8 habe ich keine Bedenken.

Bei .NET Core ist es anders:
- laufen alle Bibliotheken unter .NET Core (z.B. Microsoft.ReportViewer.Winforms)?
- läuft eine .NET Core Anwendung auf allen Windows 10 Clients?

Wie steht ihr dazu? Hat jemand schon mal eine WPF-Anwendung auf .NET Core migriert und welche Probleme gab es dabei?

Gruß

Thema: Wie baut ihr einen Installer? Erfahrungen?
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo allerseits,

ich benötige für meine WPF-Anwendung einen Installer, der als Datei (MSI oder EXE) ausgeliefert wird.

Ich habe das bisher mit WiX gemacht. Das geht zwar, ich finde aber die XML-Syntax nicht sehr intuitiv. Vor allem, was die Dialog-Steuerung geht, komme ich regelmäßig ins Schwitzen.

Daher meine Frage: womit/wie baut Ihr den Installer? Wie sind Eure Erfahrungen WiX bzw. könnt Ihr Alternativen empfehlen?

Gruß

Thema: [Erledigt] Versionierung mit Platzhalter => Determinismus
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Habe es gerade gebraucht - danke!

Thema: [gelöst] Regex: Wort aus Zeichen *und* Zeichenfolge
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Manchmal hilft es, das Problem zu formulieren und dann kommt man von selbst auf die Lösung ...

Ich habe es einfach so gelöst, dass ich vor dem Matchen die Zeichenfolge '' durch '\' ersetze. Dann gibt es beim Matchen keine Konflikte mit den anderen Doppelpunkten.

Als Regex verwende ich dann statt

:+([\w\d(\:question:)]+)
diese:
:+([\w\d\\]+)

Thema: [gelöst] Regex: Wort aus Zeichen *und* Zeichenfolge
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

ein besserer Titel für meine Frage ist mir leider nicht eingefallen

Ich suche einen regulären Ausdruck, der ein Wort matcht, welches folgendes enthält (alles optional):
- Buchstaben
- Ziffern
- Die Zeichenfolge
Wichtig: Doppelpunkte ohne vorangestelltes Fragezeichen sind nicht im Wort enthalten. Wenn Doppelpunkt, dann muss davor ein Fragezeichen kommen.

Den gesuchten Wörtern ist immer eine Reihe von Doppelpunkten vorangestellt.

Beispiel (die gesuchten Wörter in großer Schrift):
:::::::::::mTMFN1:********0340+:::::::::SOiPhone

Mein Ansatz ist, die Wörter mittels Capture Groups auszulesen. Folgende Regex ist mir bisher eingefallen:

:+([\w\d(\:question:)]+)

Das funktioniert nicht 100%, da der Doppelpunkt nach MFN1 im Match enthalten ist (was nicht sein soll):
- mTMFN1: (falsch, der Doppelpunkt am Ende soll nicht enthalten sein)
- SOiPhone (richtig)

Hier kann man damit rumspielen:

Frage: welche Regex matcht die gesuchte Zeichenfolge, aber ignoriert ':' ohne vorangestelltes Fragezeichen?

Gruß

Thema: Binding auf ViewModel in einem Style
Am im Forum: GUI: WPF und XAML

Hallo allerseits,

ich möchte den Hintergrund für alle DataGrids per Style setzen:


<Style TargetType="{x:Type DataGrid}">
    <Setter Property="Background">
        <Setter.Value>
            <VisualBrush Stretch="None">
                <VisualBrush.Visual>
                    <StackPanel>
                        <Label Content="Huhu"/>
                        <Label Content="{Binding Path=TestProperty}" />
                    </StackPanel>
                </VisualBrush.Visual>
            </VisualBrush>
        </Setter.Value>
    </Setter>
</Style>

Ein DataGrid wird dann wie folgt eingebunden (stark verkürzt):
<UserControl>
<!-- ... -->
<DataGrid
        ItemsSource="{Binding ItemListView}"
        SelectedItem="{Binding SelectedItem}">
    <DataGrid.Columns>
        <!-- ... -->
    </DataGrid.Columns>
</DataGrid>
</UserControl>

Das UserControl hat als DataContext ein ViewModel:

public class MyViewModel
{
        public ListCollectionView ItemListView { get; protected set; }

        public object SelectedItem { get; set; }

        public string TestProperty => "Blub";

        // ....
}

Problem: das Label mit dem Text "Huhu" wird angezeigt, das zweite Label bleibt leer. Es scheint, dass das Binding auf TestProperty nicht aufgelöst werden kann. Eine Fehlermeldung wird nicht ausgegeben.

Bindings, welche direkt im XAML des UserControls verwendet werden, funktionieren (ItemListView, SelectedItem).

Wie kann ich im Style dafür sorgen, dass der "richtige" DataContext verwendet wird?

Gruß

Thema: Bearbeitungszyklus mit DbContext implementieren: Best-Practice
Am im Forum: GUI: WPF und XAML

Habe mir das mal angesehen. Der Vorteil ist ja, dass ich damit oft benutzte Queries wiederwenden kann.

Durch das Schreiben der Request/ResponseHandler (oder Query oder wie immer man das jetzt nennt) gibt es allerdings auch einen Mehraufwand bei der Implementierung.

Nicht klar ist mir, wie das Konzept UnitOfWork bzw. DbContext zusammen mit dem Mediator verwendet werden kann.

Gruß

Thema: Bearbeitungszyklus mit DbContext implementieren: Best-Practice
Am im Forum: GUI: WPF und XAML

Zitat von Abt
Deine UnitOfWork Implementierung würde auch dazu führen, dass Du Repositories instanziierst, die Du gar nicht brauchst.

Moderne Pattern (werfe erneut MediatR in den Raum) machen das alles viel eleganter und übersichtlicher.

Den ersten Punkt verstehe ich nicht - das Repository wird doch nur instanziiert, wenn tatsächlich auf die Property zugegriffen wird:

private AufgabeRepository _aufgabeRepository;
public AufgabeRepository AufgabeRepository
{
    get
    {
        if (_aufgabeRepository == null) _aufgabeRepository = new AufgabeRepository(_context);
        return _aufgabeRepository;
    }
}

Ich gebe zu, dass ich ich das Konzept hinter MediatR & Co. nicht ganz kapiert habe. Gefunden habe ich dieses Beispiel.

public class LoginViewModel : BaseViewModel
{
    private readonly IMediator _mediator;

    // ...
    public IMvxAsyncCommand LoginCommand => new MvxAsyncCommand(LoginAsync, () => CanLogin);

    // ...

    public bool CanLogin => !string.IsNullOrEmpty(Username) && Username.Length ≥ 5 &&
                                   !string.IsNullOrEmpty(Password) && Password.Length ≥ 4;
    
    private async Task LoginAsync()
    {
        var result = await _mediator.Send(LoginRequest.WithCredentials(Username, Password))
                                    .ConfigureAwait(false);

        if (result.Succes)
            await NavigationService.Navigate<StartViewModel>()
                                   .ConfigureAwait(false);
        else
            ErrorMessage = result.Message;
    }
}

Klassischerweise würde man das doch so machen:

private async Task LoginAsync()
    {
        bool success = LoginService.Login(Username, Password);

        if (success)
            NavigationService.Navigate<StartViewModel>()
                                   .ConfigureAwait(false);
        else
            ErrorMessage = result.Message;
    }


Wenn ich das richtig verstehe, muss ich bei Verwendung des Mediators für jede Benutzerinteraktion einen Request und Response erstellen. Ist das nicht ein großer Overhead?

Gruß

Thema: Bearbeitungszyklus mit DbContext implementieren: Best-Practice
Am im Forum: GUI: WPF und XAML

Danke für die eindeutige Antwort.

Dann stelle ich jetzt doch mal die Frage nach der Implementierung
Ich sehe zwei Möglichkeiten:
1) direkt den DbContext als UoW zu verwenden
2) vom DbContext mittels Repositories zu abstrahieren und diese dann in ein eigenes UoW packen:

public class UnitOfWork : IDisposable
{
    protected MyDbContext _context = new MyDbContext();

    private AufgabeRepository _aufgabeRepository;
    public AufgabeRepository AufgabeRepository
    {
        get
        {
            if (_aufgabeRepository == null) _aufgabeRepository = new AufgabeRepository(_context);
            return _aufgabeRepository;
        }
    }

    private PersonRepository _personRepository;
    public PersonRepository PersonRepository
    {
        get
        {
            if (_personRepository == null) _personRepository = new PersonRepository(_context);
            return _personRepository;
        }
    }

    // alle anderen Repositories (eines pro DB-Tabelle)

    public void Commit()
    {
        _context.SaveChanges();
    }

    public void Dispose()
    {
        _context.Dispose();
    }
}

Variante 1) ist schön einfach. Bei Variante 2) habe ich den Vorteil, dass ich wiederverwendbare Queries im Repository implementieren kann.

Was meint Ihr ...?

Gruß

Thema: EF6 Objekte mit NavigationProperties dürfen als Referenz nicht dasselbe Objekt haben
Am im Forum: Datentechnologien

Nochmals Danke für die Erklärung.

Ich arbeite aktuell an einer Desktopanwendung und kämpfe damit, einen sauberen Bearbeitungszyklus zu implementieren. Das geht über die Ursprungsfrage hinaus, deswegen habe ich dafür mal einen neuen Thread erstellt.

Thema: Bearbeitungszyklus mit DbContext implementieren: Best-Practice
Am im Forum: GUI: WPF und XAML

Hallo allerseits,

ich arbeite aktuell an einer Desktop-Anwendung mit WPF und EF6.

In einem vorherigen Beitrag ist die Frage aufgetaucht, wie der Bearbeitungszyklus am besten zu implementieren ist. Damit meine ich:
1) Benutzer öffnet einen Datensatz zur Bearbeitung
2) Benutzer nimmt Eingaben vor
3) Benutzer speichert seine Eingaben

Ich habe es bisher so gemacht, dass ich mit Objekten im detached-State arbeite: erst beim Speichern der Änderungen wird ein neuer DbContext erzeugt und dann gespeichert. Das führt zu Problemen (siehe oben genannter Thread).

Die Alternative ist ja, ein UnitOfWork zu verwenden:
1) Benutzer öffnet einen Datensatz zur Bearbeitung (Kontext wird erzeugt)
2) Benutzer nimmt Eingaben vor
3) Benutzer speichert seine Änderungen (Kontext wird committed).

Wie genau man den UnitOfWork implementiert (DbContext als UoW oder abstrahiert), ist hier erstmal nicht so wichtig.

Meine Frage: ist dieses Verfahren auch in einer Desktop-Anwendung zu empfehlen? Was ist hier der Best-Practice? Was, wenn der Benutzer zwischen Schritt 2) und 3) einen Kaffee trinken geht? Dann bleibt der Kontext ja über mehrere Minuten geöffnet ...

Gruß

Thema: EF6 Objekte mit NavigationProperties dürfen als Referenz nicht dasselbe Objekt haben
Am im Forum: Datentechnologien

Zitat von Abt
Das ist der korrekte Weg - auch in dieser Form in der Doku zu finden ... Dank Dependency Injection kann man das auch vollkommen automatisieren

Also erstmal Danke für die Hinweise.

Einige Konzepte sind für mich neu. Ich habe bisher immer mit detached-Objekten gearbeitet (nicht nur in WPF, sondern z.B. auch in Webanwendungen mit JEE).

Ich verstehe Dich so: Der Context wird mittels UnitOfWork erstellt und am Ende des Bearbeitungszyklus comitted.

Nicht ganz klar ist mir, wie Du das mit dem Automatisieren meinst. So wie ich das verstanden habe, kann man per RX dafür sorgen, dass alle Änderungen im ViewModel automatisch auf das Datenobjekt (in meinem Fall Aufgabe) übertragen werden.

Hab ich Dich richtig verstanden?

Gruß

Thema: EF6 Objekte mit NavigationProperties dürfen als Referenz nicht dasselbe Objekt haben
Am im Forum: Datentechnologien

Zitat von Abt
Ein Kontext scoped in der Methode zu erstellen; das war aber auch noch nie eine gute Idee.

Wie würdest Du es denn machen? Am Anfang des Bearbeitungszyklus den Kontext erstellen und auf diesem Kontext arbeiten, bis der Benutzer seine Änderungen gespeichert hat?

Gruß

Thema: EF6 Objekte mit NavigationProperties dürfen als Referenz nicht dasselbe Objekt haben
Am im Forum: Datentechnologien

Zitat von witte
Hallo,
1. ein Context sollte von jedem Entity nur ein Exemplar zurückgeben. Wenn du zweimal Anfragen an ein Context machst sollten alle erneut ausgelesen Entities die bereits in der ersten Anfrage geliefert wurden verworfen und statt dessen die bereits ausgegebenen Exemplare erneut geliefert werden. Versuche also die beiden Personen-Instanzen mit denselben Context auszulesen.
2. Du könntest versuchen IEquatable<TEntity> zu implementieren bei dem du sagst dass zwei Exemplare mit derselben Id identisch sind. Aber sei vorsichtig bei Anfügen von Objekten da hier die Id geändert wird.

Zu 1.):
VonPerson ist immer der aktuell im System angemeldete Benutzer, während AnPerson in der GUI aus einer Liste von Benutzern ausgewählt wurde. Daher sind es immer zwei Instanzen, die aus aus zwei Contexten kommen.

Ich müsste also eine Routine implementieren, welche vor dem Speichern alle NavigationProperties checkt und bei Duplikaten dafür sorgt, dass die betreffenden NavigationProperties auf dieselbe Instanz verweisen.

Zu 2.)
Das habe ich eben mal ausprobiert, der Fehler kommt leider trotzdem. Die Equals()-Methode wird gar nicht aufgerufen.

Nachtrag: Was ich nicht kapiere: EF "weiß" doch, dass Id der Primärschlüssel von Person ist. Da der State von VonPerson und AnPerson explizit auf Unchanged gesetzt wird, sollte es EF doch gar nicht interessieren, dass das zwei unterschiedliche Instanzen sind.

Thema: EF6 Objekte mit NavigationProperties dürfen als Referenz nicht dasselbe Objekt haben
Am im Forum: Datentechnologien

verwendetes Datenbanksystem: SQL Server 2017 Express, EF6

Hallo allerseits,

ich habe eine Datenbank mit ca. 70 Tabellen und verwende EF6 (z.Zt. Database First).

Der relevante Code:


public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Aufgabe
{
    public int Id { get; set; }
    public string Titel { get; set; }
    public int VonPersonId { get; set; }
    public int AnPersonId { get; set; }
    public virtual Person VonPerson { get; set; }
    public virtual Person AnPerson { get; set; }
}

public class AufgabeRepository
{
    // Methoden Get, Exists, Delete, ...

    public void Save(Aufgabe aufgabe)
    {
        using (var context = CreateContext())
        {
            context.Entry(aufgabe).State = System.Data.Entity.EntityState.Added;
            context.Entry(aufgabe.VonPerson).State = System.Data.Entity.EntityState.Unchanged;
            context.Entry(aufgabe.AnPerson).State = System.Data.Entity.EntityState.Unchanged; // FEHLER, wenn AnPerson dieselbe Id wie VonPerson besitzt
            context.SaveChanges();
        }
    }
}

Es geht um den Aufruf Save(): ich übergebe zum Speichern eine Aufgabe im Zustand detached. Da ich nur die Aufgabe speichern will, setze ich den State von VonPerson und AnPerson auf Unchanged.

Mein Problem:
Es ist ein normaler Anwendungsfall, dass der Ersteller der Aufgabe (VonPerson) und der Empfänger (AnPerson) dieselbe Person sind (also dieselbe Id besitzen), aber zwei unterschiedliche Objekt-Instanzen.

Ist das der Fall, erhalte ich bei oben gekennzeichnten Zeile den Fehler:
Fehler
System.InvalidOperationException: "Fehler beim Speichern oder Übernehmen der Änderungen, weil mehrere Entitäten des Typs 'Data.Person' den gleichen Primärschlüsselwert aufweisen. Stellen Sie sicher, dass explizit festgelegte Primärschlüsselwerte eindeutig sind.

Workaround:
Diesen Fehler kann ich vermeiden, indem ich für die Referenzen auf Person nur die Id-Werte setze:

using (var context = Entities.CreateContext())
{
    aufgabe.VonPersonId = aufgabe.VonPerson.Id;
    aufgabe.VonPerson = null;
    aufgabe.AnPersonId = aufgabe.AnPerson.Id;
    aufgabe.AnPerson = null;
    context.Entry(aufgabe).State = System.Data.Entity.EntityState.Added;
    context.SaveChanges();
}

Meine Frage:
Ich finde diesen Workaround total umständlich. Das Problem betrifft auch viele andere Entitäten. Ich habe es im Moment so gelöst, dass Per Code-Generator alle Entitäten eine Methode PrepareForSave() haben, welche den Workaournd ausführt.

Geht das nicht einfacher?

Gruß

Thema: Benutzerfreundlicher Report Designer - könnt ihr was empfehlen?
Am im Forum: Rund um die Programmierung

Zitat von witte
Dann mach doch ein extra ein-Mann-Projekt.

Ja, mit einem separaten Projekt könnte man es machen. Dann sollten eigentlich nur Entwickler-Lizenzen benötigt werden, wenn diese auch Zugriff auf das Projekt haben.

Thema: Benutzerfreundlicher Report Designer - könnt ihr was empfehlen?
Am im Forum: Rund um die Programmierung

Zitat von Stefan.Haegele
Mei, jeder will gute Software und keiner ist bereit dafür zu bezahlen.. Wir sprechen hier von 650€ netto (1. Jahr / Standard Lizenz / pro User).

Klar, es sind ja einmalige Kosten, das ist nicht sooo schlimm. Trotzdem find ich's blöd, Lizenzen für Entwickler zu bezahlen, welche die Lizenz gar nicht nutzen.

Thema: Benutzerfreundlicher Report Designer - könnt ihr was empfehlen?
Am im Forum: Rund um die Programmierung

Zitat von Stefan.Haegele
Ich arbeite nur mit List&Label und bin damit sehr zufrieden. Klar - ist nicht ganz billig, aber es ist das Geld wert.
Die Lizenzbedingungen sind bei List & Label so blöd. Jeder am Projekt beteiligte Entwickler benötigt eine Lizenz - auch wenn er gar nicht am Reporting arbeitet. Ich habe zwei Honorarkräfte, die ab und zu für mich arbeiten. Für die bräuchte ich dann zwei zusätzliche Lizenzen.

Thema: Benutzerfreundlicher Report Designer - könnt ihr was empfehlen?
Am im Forum: Rund um die Programmierung

Hallo allerseits,

ich weiß es gibt unendlich viele Reporting Tools. Ist klar, dass jede Einschätzung nur einen Ausschnitt aus der "Lösungsmenge" darstellt.

Worum geht's? Ich möchte Anwendern in meiner WPF-Anwendung ermöglichen, eigene Reports zu erstellen. Datenbasis ist eine SQL Server Datenbank.

Einen Report erstellt man i.d.R. in zwei Schritten:
1) Erstellen eines geeigneten DataSets (z.B. SQL-Query)
2) Erstellen des Reports-Layouts und die Verbindung von Layout zu DataSet

Beim Erstellen der SQL-Queries kann man den Anwender über vordefinierte Stored Procedures oder einen grafischen Query Editor unterstützen.

Entscheidend ist, dass der Report Designer (also das Layout-Tool) halbwegs benutzerfreundlich ist. Einarbeitung ist natürlich erforderlich.

Ich habe Reports bisher als RDLC Berichte erstellt. Es ist aber für Laien unzumutbar, Visual Studio als Designer zu verwenden.

Interessant bei meiner Recherche fand ich List & Label.

Eine Cloud-Lösung scheidet aus Datenschutzgründen aus.

Habt Ihr mit diesem Thema Erfahrungen? Könnt Ihr einen Report Designer empfehlen?

Gruß

Thema: Entity Framework: Database first vs. Code first: Geben ich bei Code-First nicht die Kontrolle ab?
Am im Forum: Datentechnologien

Zitat von gfoidl
  • die Modell-Klassen können leicht in eigenes Projekt ausgelagert werden
  • die Modell-Klassen können leicht angepasst werden, falls mehr als nur POCOs nötig ist (ohne partielle Klassen, etc. verwenden zu müssen wie beim DB-first Ansatz)
  • in den Modell-Klassen können alle C# Sprachfeatures wie Vererbung (gemeinsame Basisklassen), etc. angewandt werden (bei DB-first nur umständlich möglich) [/quote]

    Ja stimmt, das liegt eigentlich auf der Hand - bei Code First (wie der Name schon sagt) habe ich halt volle Kontrolle über die Datenklassen/POCOs. Das geht bei DB First zwar auch irgendwie (z.B. durch Anpassung der T4-Templates), aber ist halt etwas aufwändiger.

  • Thema: Entity Framework: Database first vs. Code first: Geben ich bei Code-First nicht die Kontrolle ab?
    Am im Forum: Datentechnologien

    Zitat von Alf Ator
    Zitat von sugar76
    .. das Datenbank-Schema wird separat gepflegt.

    Genau das ist nicht der Fall, wenn du Code-First verwendest.

    Habe mich unklar ausgedrückt. Wenn man so vorgeht wie von gfoidl beschrieben, wird es eben doch separat gepflegt. Davon bin bei meinem Kommentar ausgegangen.

    Thema: Entity Framework: Database first vs. Code first: Geben ich bei Code-First nicht die Kontrolle ab?
    Am im Forum: Datentechnologien

    OK, d.h., Änderungen am DB-Schema können bei Code First entweder per Reverse Engineering oder händisch in den POCOs nachgezogen werden, das Datenbank-Schema wird separat gepflegt.

    Dann frage ich mich, wo bei diesem Vorgehen denn der Vorteil von Code-First gegenüber Database First liegt? Abgesehen davon, dass es bei Verwendung von EF Core eh keine Alternative gibt.

    Thema: Entity Framework: Database first vs. Code first: Geben ich bei Code-First nicht die Kontrolle ab?
    Am im Forum: Datentechnologien

    verwendetes Datenbanksystem: SQL Server, EF6

    Hallo allerseits,

    ich weiß, es gibt diverse Artikel zu diesem Thema im Netz. Trotzdem würden mich mal Eure Meinungen zu dieser Frage interessieren.

    Ich persönlich bevorzuge Database First, da man hier volle Kontrolle über das Datenbank-Schema hat.

    Gleichzeitig weiß ich, dass bei EF Core nur noch Code First unterstützt wird.

    Bauchschmerzen bzgl. Code First habe ich vor allem, weil ich - nach meinem Verständnis von Code First - die Kontrolle über das Datenbank-Schema komplett abgebe.

    Indexe, Constraints, etc., werden doch "normalerweise" in einem SQL-Skript definiert. Ich kann mir schwer vorstellen, dass ein reales Projekt mit 100 oder mehr Tabellen mit Code First umsetzbar ist. Ich benötige doch zumindest ein SQL-Skript, in dem das Datenbank-Schema definiert ist. Schon alleine zur Dokumentation. Ebenfalls benötigt ja fast jede Applikation initiale Daten, die ja auch per SQL-Skript eingespielt werden. Wie soll das bei Code First gehen?

    Gruß

    Thema: Asynchrone Ausführung in WPF: Task.Run() oder Dispatcher.InvokeAsync?
    Am im Forum: GUI: WPF und XAML

    ... und wieder was gelernt

    Thema: Textverarbeitung für WPF-Applikation
    Am im Forum: GUI: WPF und XAML

    Hallo nochmal,

    für eine WPF-Applikation wird ein RichText-Editor benötigt, um damit Briefe und E-Mails zu schreiben. Die Briefe am besten als Docx (zur Not RTF), E-Mails im HTML-Format. Der Editor sollte grundlegende Formatierungsfunktionen enthalten und es sollte auch möglich sein, Tabellen und Bilder einzufügen. Der Brief wird aus einer Vorlage heraus erstellt, wobei diverse Text-Variablen (z.B. für die Adresse des Empfängers) von der Applikation vorausgefüllt werden.

    Ich habe das zunächst so gelöst, dass ich Word per Interop einbinde. Will der Anwender einen Brief schreiben, öffnet sich Word und die Textvariablen werden von der Applikation ersetzt. Das geht soweit, aber es ist langsam und die Steuerung von Word per Interop ist fehleranfällig.

    Jetzt suche ich nach einer Alternative. Idealerweise sollte der Editor direkt in die WPF-App eingebunden werden können.

    Für so etwas gibt es kommerzielle WPF-Komponenten, z.B. DevExpress oder Telerik WPF. Ist auf jeden Fall eine Möglichkeit, wobei mich abschreckt, dass die Lizenzgebühren pro Entwickler erhoben werden.

    Im kostenlosen/Opensource-Bereich fällt mir eigentlich nur OpenOffice ein. Wobei ich da nicht weiß, wie man das in eine C#/WPF-Applikation einbinden kann.

    Es gibt auch Opensource WPF-Editoren, z.B. diesen hier, die möchte ich aber keinem Anwender zumuten.

    Jetzt würde mich mal interessieren: habt ihr schon mal vor so einer Anforderung gestanden bzw. wie würdet ihr das "Problem" lösen? Einen Text-Editor selber zu entwickeln ist keine Option, das ist schlicht zu aufwändig.

    Gruß

    Thema: Asynchrone Ausführung in WPF: Task.Run() oder Dispatcher.InvokeAsync?
    Am im Forum: GUI: WPF und XAML

    Zitat von witte
    gfoidl meint wenn die aufzurufende Klasse eine asynchrone Schnittstelle aufweist kannst du diese mit await konsumieren und musst nicht Task.Run verwenden.

    Dann müsste man aber GetItems selbst als asynchron definieren oder?

    public abstract Task<IEnumerable<T>> GetItemsAsync();

    Thema: Asynchrone Ausführung in WPF: Task.Run() oder Dispatcher.InvokeAsync?
    Am im Forum: GUI: WPF und XAML

    Super, besten Dank für die Erklärung. Der Dispatcher sollte also nur für Aufgaben verwendet werden, welche unmittelbar die GUI betreffen und nicht für sonstige Aufgaben (Daten aus der Datenbank laden, etc.).

    Da GetItems() abstrakt und somit die Dauer unbekannt ist, werde ich weiterhin das Task.Run() verwenden.

    Gruß

    Thema: Asynchrone Ausführung in WPF: Task.Run() oder Dispatcher.InvokeAsync?
    Am im Forum: GUI: WPF und XAML

    Hallo allerseits,

    in einem ViewModel möchte ich die Möglichkeit haben, bestimmte Eigenschaften asynchron zu aktualisieren.

    Hier ein Beispiel eines ViewModels für ein DataGrid (der Code ist aufs Wesentliche reduziert). Die Methode RefreshAsync aktualisiert die Liste der Elemente, welche mittels Binding im DataGrid angezeigt werden.

    namespace MyApp.ViewModel
    {
        public abstract class ListViewModelBase<T> : ViewModelBase
        {
            public RangeEnabledObservableCollection<T> ItemList { get; protected set; }
    
            public ListViewModelBase()
            {
                 ItemList = new RangeEnabledObservableCollection<T>();
            }
    
            public async virtual Task RefreshAsync()
            {
                IEnumerable<T> items = await Task.Run(() => GetItems());
                ItemList.Replace(items);
            }
    
            public abstract IEnumerable<T> GetItems();
        }
    }
    

    Jetzt frage ich mich: ich könnte die Zeile

    IEnumerable<T> items = await Task.Run(() => GetItems());
    durch diese ersetzen:

    IEnumerable<T> items = await Application.Current.Dispatcher.InvokeAsync(() => GetItems());

    Meine Frage: wäre es hier besser, statt Task.Run() den Dispatcher-Thread zu verwenden, da ja hier letztlich die GUI aktualisiert wird?

    Gruß