Laden...

Forenbeiträge von Taucher Ingesamt 307 Beiträge

08.09.2023 - 20:12 Uhr

Hallo Leute,

ich habe ein Regex-Pattern, das alle gültigen Werte matcht. Aber ich weiß nicht wie ich das Umsetzen kann, das er mir einen Treffer gibt, wenn es nicht matcht.

^([0-9]{3,5}[\-][0-9]{3,}[,][ ][0-9]{3,5}[\-][0-9]{3,}[,][ ][0-9]{3,5}[\-][0-9]{3,})
|^([0-9]{3,5}[\-][0-9]{3,}[,][ ][0-9]{3,5}[\-][0-9]{3,})
|^([0-9]{3,5}[\-][0-9]{3,})

Ich finde auch keinerlei Beiapiele, die identisch sind.

Kann mir da hemand helfen?

23.08.2023 - 19:59 Uhr

Also ich würde tatsächlich mit html Seiten anfangen, rein client-seitig, damit du verstehst was das ist und welche Möglichkeiten du da hast. Danach würde ich CSS miteinbinden, damit du siehst, welche zusätzlichen Möglichkeiten du hast und wie es dir die Formatierung erleichtert. Dann würde ich auch javascript nicht außer acht lassen, da dies heutzutage auch stark verbreitet ist. Und dann, dann würde ich mir die Serverseitige Sache anschauen. Denn wenn du weißt wie das ganze html-zeigs funktioniert, dann kannst du dir die verschiedenen Modelle anschauen wie MVC und Co, um für dich herausfinden zu können, mit welcher Technologie du arbeiten möchtest.

14.08.2023 - 18:40 Uhr

Hallo Leute,

es ist schon ne Ewigkeit her das ich mir einen virtuellen Server eingerichtet habe, von daher bin ich nicht mehr so routiniert und habe irgendwo eine Einstellung vergessen/falsch, aber ich komme nicht drauf was.

Ich habe auf VirtualBox 7.0 einen Windows Server 2016 DataCenter installiert, und will vom Host die iisstart.htm aufrufen, bekomme aber einen Timeout. ⇒ Er findet die Seite also nicht.

Meine Einstellungen:

VirtualBox:

Netzwerk: Internes Netzwerk

DHCP Server für intnet eingerichtet

Windows Server bzw. IIS

Benutzer ASPUser angelegt ⇒ Mitglied von Benutzer

Benutzer IISUser angelegt ⇒ Mitglied von Benutzer und IIS_IUSRS

Benutzer ASPUser dem Verzeichnis inetpub hinzugefügt und Rechte gegeben (Ändern/Lesen, Ausführen/Ordnerinhalt anzeigen/Lesen/Schreiben)

Anwendungspool TestPool hinzugefügt und dort bei Erweiterte Einstellungen den IISUser hinzugefügt

Bei Default Web Site unter Bindung: Typ http; IP-Adresse: 192.168.2.2; Port 80; Hostname ist leer

Dort auch bei Grundeinstellungen den Anwendungspool TestPool, und Verbinden als den IISUser zugewiesen, und bei Einstellungen testen alles grün

Bei Erweiterte Einstellungen unter Anmeldeinformationnen für den physischen Pfad den IISUser eingetragen und bei Anwendungspool steht TestPool drin

Windows Firewal kontrolliert, alles eingetragen. Testweise auch mal deaktiviert, selbe Ergebnis

Standarddokumente kontrolliert, passt alles

Ich kann das Gast-System vom Host anpingen und bekomme auch eine Antwort, allerdings wenn ich die Seite dann mit 192.168.2.2 oder 192.168.2.2/iisstart.htm aufrufen will, bekomme ich einen timeout.

Das Gast-System hat auch die angegebene ip.

Jetzt weiß ich nicht mehr was ich noch schauen kann wieso es nicht geht. Ist sicher nur ne Kleinigkeit.

Hat vielleicht jemand einen Tipp?

Danke schon mal im Vorraus...

20.07.2023 - 17:52 Uhr

Hallo T-Virus und danke für deine Antwort.

Die Möglichkeit mit SetColumnError finde ich jetzt auch nicht schön.

Ich habe schon gelesen dass hierfür auch das ObservableCollection-Objekt genommen wird, aber da bräuchte ich ne Liste in ner Liste.

Es gibt schon auch eine Schnittstellenbeschreibung, wie die CSV-Dateien auszusehen haben. Allerdings halten sich da nicht alle dran, und so kommt es vor, dass zusätzliche Spalten vorhanden sind die da einfach nicht hingehören. Die sollen bei der Validierung dann auch ignoriert werden.

Aber eine dynamische Darstellung von Tabellen sollte schon möglich sein, um sie dann validieren zu können.

Ich werde mal weiter rechechieren und testen, vielleicht finde ich ja eine Lösung die auch nicht zu komplex ist, denn das Vorhaben ist ja eigentlich einfach.

Sollte ich was finden, werde ich es hier reinsetzen.

19.07.2023 - 20:23 Uhr

Hallo an alle,

ich habe vor, csv dateien in ein datagrid zu laden. Das mache ich per drag & drop und das funktioniert auch wunderbar. Hierzu verwende ich als itemssource eine datatable, weil ich nicht weiß, wie viel Spalten in der Datei vorhanden sind. Mein Problem ist nun, dass ich die Daten anschließend validieren möchte, und bei fehlerhaften Zellen das auch farblich im datagrid darstellen möchte. Da aber die Datarow nur strings und keine eigenen objekte akzeptiert, habe ich nun das Problem, diese Zellen mittels einem Flag isValid zu kennzeichnen. Ich habe keine Idee wie ich das umsetzen kann und bin für jeden Ansatz dankbar.

Die Überprüfung findet im ViewModel statt, sollte als mvvm pattern sein.

29.06.2023 - 07:57 Uhr

Hab das Problem gelöst. Danke für eure Hilfe.

Das Problem war, dass er die komplette Pfadangabe haben wollte.

28.06.2023 - 10:28 Uhr

Hallo Abt,

wie auch immer. Der Fehler tritt nur dann auf wie ich das mit dem XML beschrieben habe.

Allerdings ist meine Hauptfrage nicht beantwortet, wie ich der HeaderColumn ein Click Command geben kann.

Mein letzter Versuch den ich gemacht habe ist über den folgenden ColumnHeaderStyle. Als Test ob er das Template auch nimmt, habe ich dem Button ein ToolTip gegeben, und der zeigt mir das auch an. Es werden aber weder Background, Foreground oder eben der Click gemacht.

Hier der Style:

<Window.Resources>
        <Style x:Key="ColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="Background" Value="White"/>
            <Setter Property="Foreground" Value="Red"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="DataGridColumnHeader">
                        <Grid>
                            <Button Content="{TemplateBinding Content}" ToolTip="Blubb">
                                <i:Interaction.Triggers>
                                    <i:EventTrigger EventName="MouseDown">
                                        <i:InvokeCommandAction Command="{Binding ClickCommand}"/>
                                    </i:EventTrigger>
                                </i:Interaction.Triggers>
                            </Button>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

Hier das DataGrid

<DataGrid 
            x:Name="dgFileContent" 
            Grid.Row="1" 
            AutoGenerateColumns="True"
            CanUserSortColumns="False"
            CanUserReorderColumns="True"
            AllowDrop="True" 
            ColumnHeaderStyle="{DynamicResource ColumnHeaderStyle}"
            ItemsSource="{Binding FileDataTable.DefaultView}">
            
            <DataGrid.Resources>
                <Style TargetType="{x:Type DataGridRow}">
                    <Setter Property="IsHitTestVisible" Value="False"/>
                </Style>
            </DataGrid.Resources>
            
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Drop">
                    <i:InvokeCommandAction Command="{Binding DropCommand}" PassEventArgsToCommand="True"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </DataGrid>
28.06.2023 - 07:26 Uhr

Hallo Th69,

ja, der Fehler passiert zur Laufzeit.

Ich denke aber dass ich das Problem gefunden habe, und zwar wenn im XML ein ungültiger oder unlogischer Eintrag ist, und der Compiler das nicht erkennt, dann wirft es zur Laufzeit den Fehler. Wobei die Fehlermeldung nichtssagend bezüglich XML ist.

26.06.2023 - 18:22 Uhr

Kommando zurück!!!

Ich habe gerade festgestellt, dass wenn ich hier:

<i:Interaction.Triggers>
                <i:EventTrigger EventName="Drop">
                    <i:InvokeCommandAction Command="{Binding DropCommand}" PassEventArgsToCommand="True"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
            <DataGrid.Resources>
                <Style TargetType="{x:Type DataGridRow}">
                    <Setter Property="IsHitTestVisible" Value="False"/>
                </Style>
            </DataGrid.Resources>

noch irgendetwas hinzufüge, also Style z.B. dann wirft es mir auch den Fehler. Der Fehler passiert dann, wenn ich die DataTable der DataTable-Property, also hier:

public DataTable FileDataTable 
        {
            get { return _fileDataTable; }
            set
            {
                _fileDataTable = value;
                this.OnPropertyChanged("FileDataTable");
            }
        }

hinzufüge. Jetzt hab ich gar keinen Plan mehr...

26.06.2023 - 17:18 Uhr

Hallo Leute,

ich versuche gerade der HeaderColumn des DataGrids ein Command zu geben, aber ich komme nicht weiter und bräuchte mal eure Hilfe.

Ich verwende folgenden XML-Code:

<DataGrid 
            x:Name="dgFileContent" 
            Grid.Row="1" 
            AutoGenerateColumns="True"
            CanUserSortColumns="False"
            CanUserReorderColumns="True"
            AllowDrop="True" 
            HeadersVisibility="{Binding HeaderVisibility, Mode=TwoWay}"
            ItemsSource="{Binding FileDataTable, Mode=TwoWay}">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Drop">
                    <i:InvokeCommandAction Command="{Binding DropCommand}" PassEventArgsToCommand="True"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
            <DataGrid.Resources>
                <Style TargetType="{x:Type DataGridRow}">
                    <Setter Property="IsHitTestVisible" Value="False"/>
                </Style>
            </DataGrid.Resources>
            <DataGridColumnHeader>
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <i:InvokeCommandAction Command="{Binding HeaderClickCommand}" PassEventArgsToCommand="True"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </DataGridColumnHeader>
        </DataGrid>

Es wird hier eine Datei per Drag&Drop eingefügt, was soweit auch wunderbar funktioniert.

Allerdings wenn ich den Bereich <DataGridColumnHeader> einfüge, dann bekomme ich folgende Fehlermeldung:

"Die Items-Sammlung muss vor dem Verwenden von "ItemsSource" leer sein."

Das ViewModel hat folgende Deklarationen für das Command, was jetzt aber mit dem Fehler nichts zu tun hat:

public ICommand HeaderClickCommand
        {
            get
            {
                if (_headerClickCommand == null)
                    _headerClickCommand = new RelayCommand(param => this.HeaderClick(param), param => this.CanHeaderClick());

                return _headerClickCommand;
            }
        }
        public bool CanHeaderClick()
        {
            return true;
        }
        public void HeaderClick(object obj)
        {

        }

Was mache ich falsch bzw. was muss ich machen damit ich auf die HeaderColumns ein Click-Command bekomme?

28.05.2022 - 16:58 Uhr

Verwendetes Datenbanksystem: <SQL-Express>
Hallo Leute, ich habe 3 Tabellen:
TB_User
UserId
.
.
.

TB_UserModule
UserId
ModuleId

TB_Module
ModuleId
.
.
.

Jetzt will ich alle User haben die mit einer bestimmten ModuleId verknüpft sind.
In SQL sieht die Abfrage so aus:


select * from TB_User as u
	inner join TB_UserModule as um
		on u.UserId = um.UserId
	inner join TB_Module as m
		on um.ModuleId = m.ModuleId
where m.ModuleId = 1

Mein Ansatz ist leider nicht viel, ich habe nur:


context.TB_User.Where(s => s.TB_Module

Ja, und dann hakts...
Kann mir da bitte jemand helfen.

04.05.2021 - 14:34 Uhr

Danke für die Infos.

Die DataTrigger können das auch, vermutlich sogar ein Stück besser.

Hast du da vielleicht ein Beispiel dafür?

03.05.2021 - 17:26 Uhr

Hallo an alle,
ich habe mal generell die Frage, ob es denn in MVVM möglich ist, ob ein UserControl das PropertyChanged eines anderen UserControls mitbekommen kann, und das ohne Events?

Also um konkreter zu werden ein Beispiel: Ich habe eine UserControl, das ein TreeView enthält. Dieses UserControl befindet sich innerhalb eines anderen UserControls. Jetzt will ich mit dem anderen UserControl darauf reagieren, wenn sich das SelectedItem des TreeViews ändert.
Meine einzige Idee dazu jetzt wäre über Events.
Deshalb meine Frage, gibt es für das MVVM-Pattern da eine spezielle Lösung, das ich irgendwie von außen das PropertyChanged mitbekommen kann, oder müssen da wieder Events her?

11.03.2021 - 21:36 Uhr

Hallo Wilfried, Hallo Lukasrad02,

jetzt weiß ich wo ich falsch gedacht bzw. nicht aufgepasst habe. Ich habe nicht alle Elemente in der View an das ViewModel gebunden, sondern noch wie in Forms gedacht.
Alles klar, jetzt weiß ich bescheid. Bin mit Wpf einfach noch neu und habe noch keine Routine darin.

Danke für die schnellen Antworten!

11.03.2021 - 19:14 Uhr

Hallo Leute, ich schon wieder...

Ich habe jetzt mit den Commands begonnen, und habe dazu gleich eine Frage. Und zwar habe ich in meinem ViewModel ein Command eingebaut, dass soweit auch funktioniert. Aber wie komme ich jetzt aber an die Daten aus der View ran? Denn die View ist dem ViewModel ja nicht bekannt, sondern andersrum...

Wo liegt mein Denkfehler???

11.03.2021 - 15:41 Uhr

Ich meinte die Verwendung der Click-Methoden im CodeBehind, anstatt Commands (ICommand) mittels MVVM zu verwenden (dann wäre nämlich die gesamte Logik im ViewModel!).

Da hast du recht. Zu diesem Thema komme ich genau jetzt 😉
Wie anfangs schon erwähnt, ich bin recht neu in Wpf und wurschtle mit schrittweise durch.
Dennoch danke für den Hinweis.

11.03.2021 - 10:49 Uhr

Hallo Th69,

vielen Dank für deine Antwort.

du hast eine eigenartige Mischung aus CodeBehind und MVVM, dadurch ist es (für mich) nicht ganz leicht, deinen Code zu verstehen.

Nun ja, ich hab halt mein Model, mein ViewModel und meine View. Ich denke es wäre einfacher zu lesen/verstehen, wenn es im VS anzusehen wäre.

Aber zum Problem. Ich habe es jetzt so gelöst, dass ich die Methode loadBrandItems public gemacht habe, und sie dann immer aufrufe, wenn es eine Veränderung gab. Zusätzlich musste ich in der Methode dann noch die Liste von ObservableCollection<IDisplayMemberModel> in der Methode mit Clear() "löschen".

Vielen Dank!

10.03.2021 - 16:03 Uhr

Hallo Leute,

ich versuche mich gerade mal wieder an Wpf, und komme leider nicht weiter. Es geht darum, das die Items in meiner ListBox nicht aktualisiert werden. Ich habe da hier im Forum und über die Suchmaschine bereits Beispiele gefunden, aber leider komme ich damit nicht weiter.

Kurz zum Aufbau des Programms:
Ich habe ein MainWindow, das in 2 Hälften (links und rechts) aufgeteilt ist. Auf der linken Seite befinden sich Buttons, wo bei entsprechendem Klick, rechts ein UserControl geladen werden soll. Das funktioniert soweit bereits prima.
Das neu geladene UserControl ist wiederrum in 2 Hälften (oben und unten) aufgeteilt, wobei sich oben wieder Buttons befinden, und bei entsprechendem Klick, unten ein weiteres UserControl geladen wird. Auch das funktioniert soweit schon mal alles prima.
Allerdings fangen hier dann die Probleme schon einmal an.
Ich habe in dem UserControl das dann im unteren Bereich geladen wird, eine TextBox. Diese soll beim laden fokusiert werden, das versuche ich mit .Focus(). Der Cursor befindet sich zwar in der TextBox, allerdings blinkt er nicht, und wenn ich per Tastatur dann versuche eine Eingabe zu machen, ist die TextBox nicht fokusiert, also es tut sich nichts.

Das andere ist, ich habe in diesem UserControl auch eine ListBox, wo ich Einträge hinzufügen und löschen kann. Datenbanktechnisch werden die Einträge auch gelöscht bzw. angelegt, aber die ListBox bzw. deren Items werden dabei nicht aktualisiert.
Wie oben bereits erwähnt, komme ich jetzt hier nicht weiter und bräuchte da Hilfe dazu.

Hier mal die ganzen Klassen und xml´s dazu: (Ich weiß das es viele sind...)
Das Model mit Interface (DisplayMemberModel, IDisplayMemberModel):


public interface IDisplayMemberModel : INotifyPropertyChanged
    {
        string DisplayMember { get; set; }
        int Id { get; set; }
    }
public class DisplayMemberModel : IDisplayMemberModel
    {
        #region ... vars
        private string _displayMember;
        private int _id;
        #endregion

        #region ... properties
        public string DisplayMember
        {
            get => this._displayMember ?? string.Empty;
            set
            {
                if (this._displayMember != value)
                {
                    this._displayMember = value;
                    this.NotifyPropertyChanged("DisplayMember");
                }
            }
        }
        public int Id
        {
            get => this._id;
            set
            {
                if (this._id != value)
                {
                    this._id = value;
                    this.NotifyPropertyChanged("Id");
                }
            }
        }
        #endregion

        #region ... events
        public event PropertyChangedEventHandler PropertyChanged;
        public void NotifyPropertyChanged(string propName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
        #endregion
    }

Hier die ViewModels mit den dazugehörigen Views:


public abstract class BaseViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
public class MainWindowViewModel : BaseViewModel
    {
        #region ... vars
        private ObservableCollection<IDisplayMemberModel> _naviButtons = new ObservableCollection<IDisplayMemberModel>();
        #endregion

        #region ... constructor
        public MainWindowViewModel()
        {
            this.createNaviButtons();
        }
        #endregion

        #region ... properties
        public ObservableCollection<IDisplayMemberModel> NaviButtons
        {
            get => this._naviButtons;
            set
            {
                if(this._naviButtons != value)
                {
                    this._naviButtons = value;
                    this.OnPropertyChanged("NaviButtons");
                }
            }
        }
        #endregion

        #region ... methods
        private void createNaviButtons()
        {
            this.NaviButtons.Add(new DisplayMemberModel() { DisplayMember = TextProvider.GetFormattedText(EnumIdentifier.overview), Id = (int)EnumIdentifier.overview });
            this.NaviButtons.Add(new DisplayMemberModel() { DisplayMember = TextProvider.GetFormattedText(EnumIdentifier.categories), Id = (int)EnumIdentifier.categories });
            this.NaviButtons.Add(new DisplayMemberModel() { DisplayMember = TextProvider.GetFormattedText(EnumIdentifier.product_settings), Id = (int)EnumIdentifier.product_settings });
        }
        #endregion
    }
public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            //  Deklariert das ViewModel für das MainWindow
            DataContext = new MainWindowViewModel();
        }
        
        private void MenuItem_CloseClick(object sender, RoutedEventArgs e)
        {
            this.closeApplication(sender, e);
        }
        private void closeApplication(object sender, RoutedEventArgs e)
        {
            //  Routine zum Schließen der Anwendung hier einfügen
            Application.Current.Shutdown();
        }

        void naviButton_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;
            if (btn == null) return;
            int id;
            if (!int.TryParse(btn.Tag.ToString(), out id)) return;
            this.gvContent.Children.Clear();
            switch(id)
            {
                case 0:
                    break;
                case (int)EnumIdentifier.categories:
                    this.gvContent.Children.Add(new CtrlProductCategories());
                    break;
                case (int)EnumIdentifier.product_settings:
                    this.gvContent.Children.Add(new CtrlProductSettings());
                    break;
            }
        }
    }


<Window x:Class="ProductManagement.Wpf.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="600" Width="800"
        WindowStartupLocation="CenterScreen" WindowState="Maximized">
    <Window.Resources>
        <Style x:Key="CustomGridSplitterStyle" TargetType="GridSplitter">
            <Setter Property="Background">
                <Setter.Value>
                    <SolidColorBrush>
                        <SolidColorBrush.Color>
                            <Color A="255" R="155" G="155" B="155" />
                        </SolidColorBrush.Color>
                    </SolidColorBrush>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="300px" MinWidth="300" MaxWidth="600" />
            <ColumnDefinition Width="5" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <DockPanel Grid.ColumnSpan="3" Name="dpTrv">
            <Menu DockPanel.Dock="Top">
                <MenuItem Header="_Datei">
                    <Separator />
                    <MenuItem Header="_Schließen" Click="MenuItem_CloseClick"/>
                </MenuItem>
                <MenuItem Header="_Bearbeiten">
                    <MenuItem Header="_Produkte">
                        <MenuItem Header="_Übersicht" />
                        <MenuItem Header="_Produkt erstellen" />
                    </MenuItem>
                </MenuItem>
                <MenuItem Header="_Datenbestand">
                    <MenuItem Header="_Daten synchronisieren">
                        <MenuItem Header="_Alle" />
                        <MenuItem Header="Quellen auswählen" />
                    </MenuItem>
                </MenuItem>
                <MenuItem Header="Test">
                    <MenuItem Header="Overview" />
                </MenuItem>
            </Menu>
        </DockPanel>
        <GridSplitter Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" Width="3" HorizontalAlignment="Stretch" Style="{StaticResource CustomGridSplitterStyle}">
            
        </GridSplitter>
        <DockPanel Grid.Column="2" Grid.Row="1" Name="gvContent">
            
        </DockPanel>
        <DockPanel Grid.Column="0" Grid.Row="1">
            <Grid VerticalAlignment="Top">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <StackPanel Name="naviButtonContainer">
                    <ItemsControl ItemsSource="{Binding NaviButtons}">
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <Button Content="{Binding DisplayMember}" Tag="{Binding Id}" Click="naviButton_Click" />
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </StackPanel>
            </Grid>
        </DockPanel>
    </Grid>
</Window>



public class CtrlProductSettingsViewModel : BaseViewModel
    {
        #region ... vars
        private ObservableCollection<IDisplayMemberModel> _naviButtons = new ObservableCollection<IDisplayMemberModel>();
        #endregion

        #region ... constructor
        public CtrlProductSettingsViewModel()
        {
            this.createNaviButtons();
        }
        #endregion

        #region ... properties
        public ObservableCollection<IDisplayMemberModel> NaviButtons
        {
            get => this._naviButtons;
            set
            {
                if(this._naviButtons != value)
                {
                    this._naviButtons = value;
                    this.OnPropertyChanged("NaviButtons");
                }
            }
        }
        #endregion

        #region ... methods
        private void createNaviButtons()
        {
            this.NaviButtons.Add(new DisplayMemberModel() { DisplayMember = TextProvider.GetFormattedText(EnumIdentifier.brands), Id = (int)EnumIdentifier.brands });
        }
        #endregion
    }
public partial class CtrlProductSettings : UserControl
    {
        #region ... constructor
        public CtrlProductSettings()
        {
            InitializeComponent();
            this.DataContext = new CtrlProductSettingsViewModel();
        }
        #endregion

        #region ... methods
        
        #endregion

        #region ... events
        private void naviButton_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;
            if (btn == null) return;
            int id;
            if (!int.TryParse(btn.Tag.ToString(), out id)) return;
            this.UserControlContainer.Children.Clear();
            switch(id)
            {
                case (int)EnumIdentifier.brands:
                    this.UserControlContainer.Children.Add(new CtrlBrands());
                    break;
            }
        }
        #endregion
    }


<UserControl x:Class="ProductManagement.Wpf.Views.CtrlProductSettings"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:ProductManagement.Wpf.Views"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <Style x:Key="button" TargetType="Button">
            <Setter Property="Height" Value="125"/>
            <Setter Property="Width" Value="125"/>
            <Setter Property="HorizontalAlignment" Value="Left"/>
        </Style>
    </UserControl.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>

        <DockPanel Grid.Row="0" Name="buttonContainer">
            <ItemsControl ItemsSource="{Binding NaviButtons}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Button Content="{Binding DisplayMember}" Tag="{Binding Id}" Click="naviButton_Click" Style="{StaticResource button}"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </DockPanel>

        <DockPanel Grid.Row="1" Name="UserControlContainer">
            
        </DockPanel>
    </Grid>
</UserControl>



public class CtrlBrandsViewModel : BaseViewModel
    {
        #region ... vars
        private ObservableCollection<IDisplayMemberModel> _brands = new ObservableCollection<IDisplayMemberModel>();
        #endregion

        #region ... constructor
        public CtrlBrandsViewModel()
        {
            this.loadBrandItems(null);
        }
        #endregion

        #region ... properties
        public ObservableCollection<IDisplayMemberModel> Brands
        {
            get => this._brands;
            set
            {
                if(this._brands != value)
                {
                    this._brands = value;
                    this.OnPropertyChanged("Brands");
                }
            }
        }
        #endregion

        #region ... methods
        private void loadBrandItems(string searchString)
        {
            IList<IBrandData> brands = ProductManagement.Storage.Manager.MainProductPropertyManager.Current.GetBrands(searchString);

            foreach(IBrandData brand in brands)
            {
                this._brands.Add(new DisplayMemberModel() { Id = brand.BrandId, DisplayMember = brand.BrandName });
            }
        }
        #endregion
    }
public partial class CtrlBrands : UserControl
    {
        public CtrlBrands()
        {
            InitializeComponent();
            this.DataContext = new CtrlBrandsViewModel();
            this.txtBrandName.Focus();
        }
        private void BtnSave_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;
            if (btn == null) return;
            //  ToDo: Fehlermeldung anzeigen
            if (this.txtBrandName.Text == null || string.IsNullOrWhiteSpace(this.txtBrandName.Text)) return;
            MainProductPropertyManager.Current.CreateBrand(this.txtBrandName.Text);
        }

        private void BtnDelete_Click(object sender, RoutedEventArgs e)
        {
            IDisplayMemberModel brand = this.lbBrands.SelectedItem as IDisplayMemberModel;
            if (brand == null) return;
            if (this.txtBrandName.Text == null || string.IsNullOrWhiteSpace(this.txtBrandName.Text)) return;
            MainProductPropertyManager.Current.DeleteBrand(brand.Id);
        }

        private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ListBox lb = sender as ListBox;
            if (lb == null) return;
            IDisplayMemberModel brand = lb.SelectedItem as IDisplayMemberModel;
            if (brand == null) return;
            this.txtBrandName.Text = brand.DisplayMember;
        }
    }


<UserControl x:Class="ProductManagement.Wpf.Views.CtrlBrands"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:ProductManagement.Wpf.Views"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="25" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <StackPanel VerticalAlignment="Top" Grid.ColumnSpan="2" HorizontalAlignment="Center">
            <Label Name="lblBrands" Content="Brands"/>
        </StackPanel>
        <DockPanel Name="dpnlViewBrands" Grid.Row="1">
            <ListBox Margin="15"
                     VerticalAlignment="Stretch"
                     ItemsSource="{Binding Brands}"
                     SelectionChanged="ListBox_SelectionChanged"
                     Name="lbBrands"
                >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <TextBlock Text="{Binding DisplayMember}" Tag="{Binding Id}" />
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>
                <ListBox.Style>
                    <Style x:Name="EmptyListStyle"
                           TargetType="ListBox"
                           BasedOn="{StaticResource {x:Type ListBox}}">
                        <Style.Triggers>
                            <Trigger Property="HasItems" Value="false">
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate>
                                            <TextBlock Text="Keine Einträge vorhanden" HorizontalAlignment="Center"/>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </ListBox.Style>
            </ListBox>
        </DockPanel>
        <StackPanel Name="dpnlModifyBrands" Grid.Column="1" Grid.Row="1" VerticalAlignment="Bottom">
            <TextBox Name="txtBrandName" VerticalAlignment="Bottom"/>
            <Button Name="btnSave" Content="Speichern" VerticalAlignment="Bottom" Click="BtnSave_Click" />
            <Button Name="btnDelete" Content="Löschen" VerticalAlignment="Bottom" Click="BtnDelete_Click" />
        </StackPanel>
    </Grid>
</UserControl>


Kann mir jemand sagen wo der Fehler liegt bzw. was ich falsch mache?

15.08.2020 - 18:04 Uhr

Ich danke euch allen für die Antworten! Ich werde mich morgen nochmal hinsetzen, und denke auch das es dann klappen wird, und ich dann auch hoffentlich sagen kann, wo meine Blockade lag...

@Abt

Sorry, was Du gemacht hast ist kein Reverse Engineering sondern blind im Dunkel stochern; sorry für die direkten Worte.
Das hat mit Reverse Engineering nichts, aber auch gar nichts zutun. Nicht mal Ansatzweise.

Hier stehts, und genau das habe ich gemacht.
Reverse Enginering

15.08.2020 - 17:22 Uhr

Hm, ich versuche eine 1:n Beziehung darzustellen. Ich habe laut Doku schon gesehen, dass dort immer nur 2 Klassen verwendet werden. Für das Beispiel hier dann eben in der Mother-Klasse die Children-Collection, und dann in der Children-Klasse nochmal die Eigenschaft der Mutter.
Aber ich habe dann aber das Problem, dass wenn ich mir alle Mütter anzeigen lassen will, die als Kind, z.B. "Karin" haben, ich von der Abfrage her nicht hinkomme, die where-Klausel auf die Children-Klasse zu machen.

Wieso nehme ich 3 Klassen? Wie bereits erwähnt, habe ich mir von Entity, durch das Reverse-Enginering, die Modelle mal erstellen lassen, um zu sehen, wie die das machen. Und die nehmen da 3 Klassen. Daher die Klasse zur Normalisierung. Auch die virtuals habe ich von dort übernommen.

Ich möchte einfach die 1:n Beziehung haben, wo ich dann auch die where-Klausel auf die Children-Klasse machen kann.

In Sql ist das ja recht einfach, aber irgendwie drehe ich mich jetzt da voll im Kreis.

Das ist wahrscheinlich voll simpel, und ich renne da grad voll in die falsche Richtung...

15.08.2020 - 16:48 Uhr

So, ich denke mal dass ich einen Schritt weiter gekommen bin.
Ich habe mir die Modelle mal von Entity selbst erstellen lassen, um zu sehen wie die das machen.
Daraus habe mir folgendes Beispiel zusammengestellt:


internal class TB_Mothers
    {
        public TB_Mothers()
        {
            this.Children = new HashSet<TB_Children>();
        }
        public int MotherId { get; set; }
        public string MotherName { get; set; }
        public ICollection<TB_Children> Children { get; set; }
    }

internal class TB_MothersChildren
    {
        public int MotherId { get; set; }
        public int ChildrenId { get; set; }
        public virtual TB_Mothers Mothers { get; set; }
        public virtual TB_Children Children { get; set; }
    }

internal class TB_Children
    {
        public int ChildrenId { get; set; }
        public string ChildName { get; set; }
        public TB_Mothers Mothers { get; set; }
    }

internal class MotherChildrenContext : DbContext
    {
        public virtual DbSet<TB_Mothers> TB_Mothers { get; set; }
        public virtual DbSet<TB_MothersChildren> TB_MothersChildren { get; set; }
        public virtual DbSet<TB_Children> TB_Children { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
                optionsBuilder.UseSqlServer("server=.;database=Test;trusted_connection=true;");
            }
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<TB_Mothers>
                (
                    entity => 
                    {
                        entity.HasKey(s => s.MotherId);
                        entity.ToTable("TB_Mothers");
                        entity.HasMany(s => s.Children)
                                .WithOne(s => s.Mothers);
                        entity.Property(s => s.MotherName)
                                .IsRequired()
                                .HasMaxLength(50);
                        entity.HasIndex(s => s.MotherName)
                                .HasName("UQ_TB_Mothers_MotherName")
                                .IsUnique();
                    }
                );

            modelBuilder.Entity<TB_MothersChildren>
                (
                    entity =>
                    {
                        entity.HasKey(s => new { s.MotherId, s.ChildrenId });
                        entity.ToTable("TB_MothersChildren");
                        entity.HasOne(s => s.Mothers)
                                .WithMany()
                                .HasForeignKey(s => s.MotherId)
                                .OnDelete(DeleteBehavior.ClientSetNull)
                                .HasConstraintName("FK_TB_MothersChildren_TB_Mother");
                        entity.HasOne(s => s.Children)
                                .WithMany()
                                .HasForeignKey(s => s.ChildrenId)
                                .OnDelete(DeleteBehavior.ClientSetNull)
                                .HasConstraintName("FK_TB_MothersChildren_TB_Children");
                                
                    }
                );

            modelBuilder.Entity<TB_Children>
                (
                    entity =>
                    {
                        entity.HasKey(s => s.ChildrenId);
                        entity.ToTable("TB_Children");
                        entity.Property(s => s.ChildName)
                                .IsRequired()
                                .HasMaxLength(50);
                    }
                );
        }
    }

Jetzt habe ich es geschafft, mir die Abfrage so zusammenzustellen, dass ich zumindest mal Daten bekomme. Und zwar so (eigentlich 1:1 wie in Sql):


var result = (
                                    from mothers in context.TB_Mothers
                                    join motherschildren in context.TB_MothersChildren
                                    on mothers.MotherId equals motherschildren.MotherId
                                    join children in context.TB_Children
                                    on motherschildren.ChildrenId equals children.ChildrenId
                                    select new TB_Mothers { MotherName = mothers.MotherName, MotherId = mothers.MotherId }
                                ).ToList();

Hier habe ich allerdings das Problem, das ich nicht weiß, wie ich das Laden der zugehörigen Daten mit include() integrieren kann.

Allerdings bringt mir diese Abfrage:


var result3 = context.TB_Mothers
                                    .Include(m => m.Children)
                                    .ToList();

auch nicht das gewünschte Ergebnis. Denn die ICollection Children hat keinen Eintrag obwohl welche vorhanden sind.
Laut der Doku hier: Laden zugehöriger Daten sollte es aber funktionieren.
Fehler im Modell???

Spaßeshalber habe ich dann mal versucht den Join in Lambda zu schreiben, wo es aber knallt:


var result2 = context.TB_Mothers
                                            .Join
                                            (
                                                context.TB_MothersChildren
                                                , m => m.MotherId
                                                , mc => mc.MotherId
                                                , (m, mc) => new { TB_Mothers = m, TB_MothersChildren = mc }
                                            ).Join
                                            (
                                                context.TB_Children
                                                , mc => mc.TB_MothersChildren.ChildrenId
                                                , c => c.ChildrenId
                                                , (mc, c) => new { TB_Children = c }
                                            ).ToList();

Was mache ich falsch bzw. wo liegt der Fehler?

05.08.2020 - 19:25 Uhr

Das Passwort ist natürlich nicht im Klartext abgespeichert, das versteht sich von selbst.
Ich habe nur durch das Beispiel mit den Klassen Account und AccountData versucht nachzustellen, es im EF-Core nachzustellen, auf einfache Weise, da die linq-Abfragen nicht (mehr) funktioniert haben, die ich im Ef6 verwendet habe.. Da ging ja alles Problemlos. Quasi zur Verständnis. Hat aber nicht funktioniert wie man sieht...
Ich mach mit C# seit 2008 rum, und ich weiß, das ich in einer Firma war, wo Fortbildung nur ein Traum war, und Freizeit um das zu tun, ja, da hätten wir wohl 10 Tage die Woche gebraucht...
Das ich in C# Defizite habe, das muss mir keiner sagen, den davor habe ich in PHP programmiert. Da ist das alles anders. Summa Sumarum, ist es bei mir einfach so, das ich eine Erklärung für "Doofe" brauche. Denn ich ich bin sicherlich keiner der das nicht versteht, sondern jemand, der ein realistisches Beispiel für das Problem braucht, was er einfach hat. Und die Hilfe zur Selbsthilfe, bringt mir oftmals nix.
Und ja, ich habe Druck im Nacken, wo ich mir überlege, Datenbankfunktionen zu nehmen, wenn das auch nicht zu kompliziert ist in .net core, oder eben auf vorherige Technologien zurückzugreifen.

05.08.2020 - 17:41 Uhr

Taucher

Ich versuche eine 1:n Beziehung zu machen. Ein Account kann mehrere AccountData haben.

05.08.2020 - 16:42 Uhr

Ja, das ist so gewollt.
Ein Account kann einenn oder mehrere AccountDaten haben.

05.08.2020 - 14:39 Uhr

Jetzt versteh ich nur noch Bahnhof...
Laut dem hier: EF-Core Beziehungen
ist das doch eine 1:n Beziehung. Oder nicht?
Wie er in die Referenztabelle die Werte schreibt, ist mir allerdings noch ein Rätsel...
Muss ich dann die Referenztabelle mit anlegen?

05.08.2020 - 14:14 Uhr

Th69

on account.AccountId equals accountData.Account.AccountId

Danke, daran lags!

witte

Wenn du das nicht brauchst kannst du die Beziehung zu 1:n vereinfachen und dir den Tanz sparen.

Ich versuche eine 1:n Beziehung zu machen. Ein Account kann mehrere AccountData haben.
Mach ich das hier nicht??? Oh man...

04.08.2020 - 18:02 Uhr

Also, ich komme überhaupt nicht weiter. Ich habe jetzt mal versucht, das Beispiel von:
Beziehungen-EF Core
in mein Beispiel umzusetzen, und zwar folgendermaßen:


public class RelationTestContext : DbContext 
    {
        public DbSet<Account> Accounts { get; set; }
        public DbSet<AccountData> AccountDatas { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<AccountData>()
                .HasOne(accountData => accountData.Account)
                .WithMany(account => account.AccountData);

            modelBuilder.Entity<AccountData>()
                .HasKey(s => s.AccountDataId);

            modelBuilder.Entity<Account>()
                .HasKey(s => s.AccountId);
        }
    }
    public class Account
    {
        public int AccountId { get; set; }
        public string LoginName { get; set; }

        public List<AccountData> AccountData { get; set; }
    }

    public class AccountData
    {
        public int AccountDataId { get; set; }
        public string EmailAddress { get; set; }
        public int ModuleId { get; set; }

        public Account Account { get; set; }
    }

    public class EntityTest
    {
        public void MyTestMethod()
        {
            List<AccountData> accountDatas = new List<AccountData>();
            accountDatas.Add(new AccountData() { AccountDataId = 1, EmailAddress = "email1", ModuleId = 1, Account = new Account() { AccountId = 1, LoginName = "Name1", AccountData = accountDatas } });
            accountDatas.Add(new AccountData() { AccountDataId = 2, EmailAddress = "email1", ModuleId = 2, Account = new Account() { AccountId = 1, LoginName = "Name1", AccountData = accountDatas } });

            List<Account> accounts = new List<Account>();
            accounts.Add(new Account() { AccountId = 1, LoginName = "Name1", AccountData = accountDatas });

            accountDatas = new List<AccountData>();
            accountDatas.Add(new AccountData() { AccountDataId = 3, EmailAddress = "email2", ModuleId = 1, Account = new Account() { AccountId = 1, LoginName = "Name2", AccountData = accountDatas } });
            accountDatas.Add(new AccountData() { AccountDataId = 4, EmailAddress = "email2", ModuleId = 2, Account = new Account() { AccountId = 1, LoginName = "Name2", AccountData = accountDatas } });

            accounts = new List<Account>();
            accounts.Add(new Account() { AccountId = 1, LoginName = "Name2", AccountData = accountDatas });


            using (RelationTestContext context = new RelationTestContext())
            {
                var result = (
                             from account in accounts
                             join accountData in accountDatas
                             on account equals accountData.Account
                             where accountData.EmailAddress == "email2"
                             && accountData.ModuleId == 2
                             select new { Account = account }
                             ).FirstOrDefault();

                var result2 = (
                                from account in accounts
                                join accountData in accountDatas
                                on account equals accountData.Account
                                select new { Account = account }
                                ).ToList();
                
            }
        }
    }

result1 ist null, und result2 hat keine Datensätze...

Ich habe keine Ahnung was und wieso das nicht funktioniert...
Wenn jemand Lust dazu hat mir weiterzuhelfen, dann freue ich mich von ihm/ihr zu hören/lesen.

31.07.2020 - 16:27 Uhr

Hier fehlt auch ein ordentlicher Model Build über OnModelCreating um eine saubere Beschreibung zu haben

Danke, daran lags!

Hinweis und Basics .NET / Datenbanken: man verwendet kein Datetime sondern DateTimeOffset

Hab ich noch nie gehört 😉
Aber danke, ich werde das demnächst berücksichtigen!

30.07.2020 - 18:03 Uhr

Das ist ja das Problem, die Spalte gibt es nirgends!
Hier der ganze Code:


internal class LoginSystemContext : DbContext
    {
        public DbSet<TB_Account> TB_Account { get; set; }
        public DbSet<TB_LoginInformation> TB_LoginInformation { get; set; }
        public DbSet<TB_ModuleId> TB_ModuleId { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder options)
                => options.UseSqlServer("server=.;database=LoginSystem;trusted_connection=true;");
    }

internal class TB_Account
	{
		#region properties...
		public int Id { get; set; }
		public string LoginName { get; set; }
		public string Password { get; set; }
		public DateTime CDate { get; set; }
		public ICollection<TB_AccountData> AccountData { get; set; }
		public ICollection<TB_ModuleId> ModuleIds { get; set; }
		#endregion
	}

internal class TB_ModuleId
    {
        #region properties...
        public int Id { get; set; }
        public string ModuleId { get; set; }
        public string ModuleName { get; set; }
        #endregion
    }

internal class TB_LoginInformation
    {
        #region properties...
        public int Id { get; set; }
        public int AccountId { get; set; }
        public int ModuleIdId { get; set; }
        public DateTime LoginDate { get; set; }
        public DateTime LogoutDate { get; set; }
        public string SessionId { get; set; }
        #endregion
    }

Und in der Datenbank gibt es diese Spalte nicht! Deshalb bin ich auch völlig Ratlos.
Mehr Code gibt es dazu nicht...

30.07.2020 - 17:06 Uhr

verwendetes Datenbanksystem: <Sql Server 2008>

Hallo Leute,
ich bin gerade dran das Entity Core Framework zu benutzen, und habe auch gleich ein Problem das ich nicht nachvollziehen kann. Und zwar bekomme ich die im Titel angegebene Fehlermeldung. Eigentlich eindeutig. Aber dieser Spaltennamen wird überhaupt nicht benutzt, und den gibt es auch nicht.
Hier noch die Methode wo der Fehler auftaucht:


public void CreateModule(string moduleId, string moduleName)
        {
            using (LoginSystemContext context = new LoginSystemContext())
            {
                TB_ModuleId module = new TB_ModuleId();
                module.ModuleId = moduleId;
                module.ModuleName = moduleName;
                
                context.TB_ModuleId.Add(module);

                using (TransactionScope scope = TransactionScopeManager.Current.BuildTransactionScope())
                {
                    context.SaveChanges();
                    scope.Complete();
                }
            }
        }

Der Fehler tritt bei context.SaveChanges() auf.
Jetzt meine Frage, wie um alles in der Welt kommt das Entity auf diesen Spaltennamen?
Es gibt zwar eine Tabelle TB_Account, aber auch dort wird der Spaltenname nicht benutzt, und den gibts da auch nicht.

27.07.2020 - 15:36 Uhr

Hallo Abt,

vielen Dank für deine ausführliche Antwort.
Wenn ich damit dann Schwierigkeiten habe, dann melde ich mich wieder.

27.07.2020 - 13:40 Uhr

verwendetes Datenbanksystem: <SqlServer 2008>
Hallo Leute,
ich bin gerade daran mir das Entity-Framework bei .Net Core einzuverleiben, und habe da gleich ein Problem mit einer 1:n Beziehung.
Und zwar habe ich folgende Tabellen:


TB_Account
--------------
AccountId
LoginName
Password

TB_AccountAccountData
----------------------------
AccountId
AccountDataId

TB_AccountData
---------------------
AccountDataId
EmailAddress
ModuleId
...

Meine Klasse für den DbContext sieht folgendermaßen aus:


internal class LoginSystemContext : DbContext
    {
        public DbSet<TB_Account> Accounts { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder options)
                => options.UseSqlServer("Data Source=LoginSystem.db");
    }

und die Klasse für das Account-Modell:


internal partial class TB_Account
	{
		#region properties...
		public int Id { get; set; }
		public string LoginName { get; set; }
		public string Password { get; set; }
		public ICollection<TB_AccountData> AccountData { get; set; }
		#endregion
	}

Wenn ich das hier: Erste Schritte mit EF Core richtig verstanden habe, dann reicht die ICollection aus, um auf die Werte einer 1:n Beziehung zugreifen zu können.
Jetzt weiß ich nicht wie ich das machen kann, um einen mir einen Datensatz anzeigen zu lassen wo folgende Kriterien erfüllt sein müssen:
-> LoginName und EmailAddress und ModuleId
vorhanden sind.
Wenn ichs richtig gelesen habe, dann brauche ich dafür den Join-Ausdruck, aber ich weiß nicht genau wie ich das Anstellen soll.
Kann mir da bitte jemand in meinem Beispiel helfen? Dann verstehe ich das wahrscheinlich auch besser als mit ähnlichen Beispielen die man so findet.

20.06.2020 - 17:11 Uhr

@Abt:

Problem bei Deim Code ist halt auch, dass Du quasi alles irgendwie miteinander verwurstelt hast, statt den Code sauber zu trennen und sauber asynchron umzusetzen.
[Artikel] Drei-Schichten-Architektur
Und wegen der sehr sauberen Umsetzung hast Du Dir selbst Race Condition-Fallen gebaut.

Ich denke schon das ich eine 3-Schichten Architektur habe, denn die Datenbankabfragen, Einträge usw. liegen in einem separatem Projekt. Sind also völlig unabhängig vom Modul was darauf zugreifen will.

Edit: mir ist aufgefallen, dass Du WPF verwendest.

Ja, ich verwende hier WPF, weil ich das einfach nur zum testen für die Datenbankebene verwenden wollte anstatt mir eine Internetseite dafür zu schreiben (Mein Schwerpunkt ist die Webentwicklung). Weil das einfach schneller geht. Denn mit WPF habe ich nicht wirklich viel gemacht und wollte das einfach auch verbinden um da ein bisschen mehr reinzukommen in WPF (Hat wohl nicht geklappt 😉 ) Deshalb auch keine Datenbindung.
Deshalb auch kein Testprojekt a la Unittest.

Danke schon mal für eure Hilfe und eure Ratschläge.

17.06.2020 - 18:09 Uhr

Ok, danke. Da werde ich dann mal nachsehen.

Ich habe die Aufrufe in Threads gelegt, weil ansonsten das Problem auftaucht das die Oberfläche nicht aktualisiert wird, das Fenster quasi hängt. Und da kam dann auch eine Fehlermeldung (ich weiß nicht mehr wie die war), und nach ner Runde googeln kam ich dann auf einen Beitrag von diesem Forum, das man Threads dafür verwenden soll. Deshalb. Ist das falsch?

Und das mit dem case 2 ist ein Schreibfehler von mir, stimmt. Is grad aber nicht so schlimm da die Methode dazu in der Methode "databaseimport" noch nicht aufgerufen wird.

17.06.2020 - 17:14 Uhr

Hallo Leute,
ich habe ein Problem mit meinem Programm wo ich etwas Ratlos bin.

Also, ich habe eine Datenbank die ich mit Stadtnamen füllen will. Dies mache ich mittels einem Dateiimport.
Aber es scheint so als hängt sich das Programm nach kurzem auf und ich weiß leider nicht wieso. Haltepunkte werden dann auch nicht mehr erreicht, egal wo ich sie setze.
Kann sich jemand mal den Code ansehen und findet vielleicht den Fehler, oder kann einen Verdacht äußern. Danke schon einmal.
Ich stelle den Code für die Methoden so rein wie sie der Reihe nach Ablaufen.


try
            {
                string line;
                string[] splitted;
                List<string> imported = new List<string>();
                List<object> temp;
                Thread th;
                using (StreamReader sr = new StreamReader(this.txtFilePath.Text, Encoding.Default))
                {
                    int i = 0;
                    while(sr.Peek() >= 0)
                    {
                        temp = new List<object>();
                        line = sr.ReadLine();
                        splitted = line.Split(',');
                        if(splitted != null && splitted.Length == 2)
                        {
                            switch(kindOfImport)
                            {
                                case 0:
                                    //  1 = Stadt
                                    if (imported.Where(s => s == splitted[1]).FirstOrDefault() == null)
                                    {
                                        temp.Add(Import.kindOfImport.city);
                                        temp.Add(splitted);
                                        th = new Thread(this.databaseimport);
                                        th.Start(temp);
                                        imported.Add(splitted[1]);
                                    }
                                    i++;
                                    break;
                                case 1:
                                    //  1 = Bundesland
                                    if (imported.Where(s => s == splitted[1]).FirstOrDefault() == null)
                                    {
                                        temp.Add(Import.kindOfImport.state);
                                        temp.Add(splitted);
                                        th = new Thread(this.databaseimport);
                                        th.Start(temp);
                                        imported.Add(splitted[1]);
                                    }
                                    i++;
                                    break;
                                case 2:
                                    //  0 = plz
                                    if (imported.Where(s => s == splitted[1]).FirstOrDefault() == null)
                                    {
                                        temp.Add(Import.kindOfImport.city);
                                        temp.Add(splitted);
                                        th = new Thread(this.databaseimport);
                                        th.Start(temp);
                                        imported.Add(splitted[0]);
                                    }
                                    i++;
                                    break;
                            }
                        }
                        this.lblImportStatus.Content = i.ToString();
                    }
                }
                MessageBox.Show("Import erfolgreich abgeschlossen.");
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }


private void databaseimport(Object obj)
        {
            List<object> l = (List<object>)obj;
            Import.kindOfImport kind = (kindOfImport)l[0];
            string[] splitted = (string[])l[1];
            switch(kind)
            {
                case Import.kindOfImport.city:
                    CityManager.Current.Add(splitted[1], true);
                    break;
                case Import.kindOfImport.state:
                    StateManager.Current.Add(splitted[1], true);
                    break;
                case Import.kindOfImport.zipCode:
                    break;
            }
        }


public void Add(string cityName, bool ignoreExisting)
        {
            CityProvider.Current.Add(cityName, ignoreExisting);
        }


public void Add(string cityName, bool ignoreExisting)
        {
            this.Add(new List<string>() { cityName }, ignoreExisting);
        }


public void Add(IList<string> cityNames, bool ignoreExisting)
        {
            if (cityNames == null) throw new ArgumentNullException("Invalid city names.");
            if (cityNames.Count() == 0) return;

            using (ZipCodeEntities context = new ZipCodeEntities())
            {
                foreach(string city in cityNames)
                {
                    var temp = context.TB_City.Where(s => s.Name.ToLower() == city.ToLower()).FirstOrDefault();
                    if (temp != null && !ignoreExisting) throw new ArgumentException("Invalid city name. City name already exists.");
                    else if (temp != null && ignoreExisting) continue;

                    context.TB_City.Add(new TB_City() { Name = city });

                    using (var scope = TransactionScopeManager.Current.BuildTransactionScope())
                    {
                        context.SaveChanges();
                        scope.Complete();
                    }
                }
            }
        }

29.02.2020 - 23:33 Uhr

Hallo Gemeinde,

ich habe heute mein erstes MVC-Projekt in VS 2013 erstellt, und habe gleich zu Beginn eine Frage dazu.
Ich habe bisher nur mit MVC 1 und 2 gearbeitet, und habe mir dafür eigene Klassen erstellt die mir dort das Leben leichter machten.
Unter anderem habe ich auch Tags über diese Klasse in die Views geschrieben wie z.B. den Title-Tag.
Jetzt hab ich bei MVC 4 das Problem, das er mir die Klammern maskiert. Also anstatt:

<title>blubb</title>

bringt er mir jetzt einen maskierten String:

&lt;title&gt;Startseite&lt;/title&gt;

Wie kann ich das ändern?

29.06.2019 - 20:03 Uhr

Hallo Abt,

du hast recht, ich habe den Codeabschnitt von Stackoverflow um es einfach zu versuchen.
Ich bin ein paar Jahre aus der Übung und verwende noch VS 2010, da ich mit der neuen MVC-Struktur von MVC 4 nicht vertraut bin und auch nicht die Zeit habe mich da reinzuwurschteln. In VS 2010 müsste ja das Framework 4.5 verwendet werden, oder nicht?
Was heißt: "volle Kontrolle"?
Ich muss "nur" bestimmte Teilabschnitte aus der Seite holen und ggf. ein Formular abschicken und dessen Inhalt dann eben weiter auswerten.

29.06.2019 - 11:57 Uhr

Hallo Gemeinde,

ich versuche mich daran, einfach eine Seite mittels Webrequest abzurufen und bekomme oben genannten Fehler, und ich weiß nicht wie ich ihn beheben kann.
Natürlich habe ich auch schon im Internet geschaut, komme aber dennoch nicht weiter.
Liegt es vielleicht an der Seite selbst wo ich aufrufen will? Denn wenn ich google.de aufrufe funktioniert es einwandfrei.
Hier der Code:


HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://rb113458.berge-meer.de/");
            //HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://www.google.de/");
            ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls;
            ServicePointManager.ServerCertificateValidationCallback += (sender, cerificate, chain, errors) 
                => 
                { 
                    
                    return errors == SslPolicyErrors.None; 
                };
            
            request.Credentials = CredentialCache.DefaultCredentials;
            
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

16.02.2015 - 21:12 Uhr

Hallo Abt und danke für die Antwort.
Wie sich herausgestellt hat war mein Problem ganz einfach umzusetzen, es lag schlicht weg daran dass ich zu wenig mit linq gemacht habe, so dass ich vergessen hatte das ich ohne joins auf die Beziehungstabellen zugreifen kann... Aber jetzt weiß ichs ja und merke mir das auch 😉

15.02.2015 - 20:45 Uhr

verwendetes Datenbanksystem: SqlServer 2008
Hallo Gemeinde,
ich brauche mal bitte Hilfe um eine Sql-Abfrage in linq umzusetzen.
Hier die Sql-Abfrage:


Select * From TB_TattooStudio as ts
	Inner Join TB_Address as a
		On ts.AddressId = a.AddressId
	Left Outer Join TB_City as c
		On a.CityId = c.CityId

Hier mein Versuch wo ich nicht weiter komme:


context.TB_TattooStudio
                        .Join
                        (
                            context.TB_Address
                            , ts => ts.AddressId
                            , a => a.AddressId
                            , (ts, a) => TattooStudio.Create(ts.TattooStudioId, ts.Name, ts.Manager, ts.ContactId, ts.IsTattooStudio, ts.IsPiercingStudio, ts.IsLocked, ts.IsDeleted, ts.AddressId)
                        )
                        .GroupJoin
                        (
                            context.TB_City
                            , temp => temp
                            , c => c
                            , (c, temp) => new { city = c, ts = temp }
                        )
                        .ToArray();

Hier die Datenbankstruktur:
TB_TattooStudio
AddressId
...

TB_Address
AddressId
CityId
...

TB_City
CityId
...

Ich hoffe die Informationen reichen aus.

23.05.2013 - 17:49 Uhr

Hallo @gfoidl,

Die Clients die die Streams zur Verfügung stellen sollen sich mittels Zugangsdaten am Server anmelden müssen. Diese Clients können sowohl Desktop- oder Mobile-Anwendungen sein.
Ebenso die Clients die die Streams ansehen bzw. anhören können sollen sich am Server mittels Zugangsdaten anmelden müssen. Auch diese Clients sollen sowohl Desktop- als auch Mobile-Anwendungen sein können.
Am Server soll es automatisch durch eine Art Service passieren, ja.

23.05.2013 - 16:02 Uhr

Hallo @gfoidl,

also ASP soll es nicht sein. Ich kenne auch nicht alle Möglichkeiten die es gibt und deshalb kann ich da keine genauen Angaben machen.
Der Ablauf soll allerdings so sein dass sich die Clients anmelden müssen dass sie Zugriff darauf haben und es sollte auch alles über einigermaßen sichere Protokolle laufen können. Das ist das Ziel, und jetzt fehlt mir der Weg 😉

23.05.2013 - 14:28 Uhr

Hallo Gemeinde,

ich habe vor ein Projekt umzusetzen dass mit Direkten Audio- und Video-Streams arbeiten soll, also sog. Liveübertragungen. Ich habe damit noch keine Erfahrungen so dass mir leider der Ansatz etwas fehlt. Im Internet findet man zwar relativ viel unterschiedliche Beiträge dazu, allerdings hat mir dabei keiner helfen können einen Ansatz zu finden.

Was soll passieren?
Eine oder mehrere Clientanwendungen sollen sich an einem Server anmelden können um Audio- und Videostreams bereitstellen zu können.
Andere Clients sollen sich ebenfalls am Server anmelden können um sich dann die Direktübertragungen ansehen bzw. anhören zu können.
Die Gestaltung der Clients ist relativ unkompliziert und macht mir bisher keine Probleme. Allerdings weiß ich nicht wie ich das am Server realisieren kann. Ich weiß nicht wie ich die Streams direkt "durchreichen" kann. Kann mir da jemand einen Ansatz liefern, denn der fehlt mir gänzlich. Alles soll mit Anmeldung laufen.

08.02.2013 - 20:48 Uhr

Hast Du denn schon mal versucht eine andere Javascript-Datei im selben Verzeichnis, also Frameworks, einzubinden um zu sehen ob der Fehler generell kommt oder nur bei der JQuery-Datei?
Kleiner Tipps noch, Du verwendest bei Deiner Verzeichnisstruktur deutsche- und englische Begriffe, Du solltest Dich auf eine Sprache festlegen. Vorzugsweise Englisch weil in diesem Beruf/Branche eigentlich alles in Englisch gemacht wird.
Auch sind die Verzeichnisse Frameworks und JQuery irreführend, denn wenn ich nach JQuery suchen würde dann würde ich natürlich erst in dem Verzeichnis jQuery suchen und nicht fündig werden.

03.01.2013 - 23:22 Uhr

Find ich nicht gut

Doch ich schon, denn localserver gibt es im Netz normalerweise nicht. Von daher ist es kein Problem das man dann auch weiterleitet wenn das eine Ausnahme bleibt. Wenn es zur Regel wird sieht das ganze sicherlich anders aus.

Wenn jemand die nicht existierende und nicht gewollte URL aufruft, dann soll er einen Fehler bekommen

Stimmt, aber hierbei handelt es sich um eine Suchmaschine die anscheinen bewußt was "falsches" aufruft. Niemand will deshalb das in der Suche Fehler auftreten, verständlich oder?

Wenn du mal eine zweite Subdomain hast, bringt dir diese Umleitung nichts mehr

Das stimmt nicht, ich kann alle "localserver"-Anfragen weiterleiten.

Frag doch mal bei Bing nach

Das ist die Möglichkeit die ich in Anspruch nehme wenn hier keine Antwort auftaucht. Denn ich habe gelernt dass nur weil ich es vielleicht nicht kenne es diese Möglichkeit nicht gibt. Und es ist nicht gewiss dass man in den Suchmaschinen vielleicht etwas nicht findet wo es aber Lösungen gibt. Da kannn ich ein Wörtchen mitreden. Wayne, kennt das jemand?

03.01.2013 - 22:34 Uhr

Also mal ganz dumm gefragt um sicherzustellen ob ich das richtig verstanden habe,
du hast 2 verschiedene Benutzergruppen die a) auf das Netzwerk zugreifen können sollen und b) die nicht auf das Netzwerk zugreifen sollen können. Ist das soweit richtig?
Wo ist denn jetzt aber die Einschränkung? Das gewisse Benutzer gar keinen Zugriff auf das Netzwerk haben oder nur beschränkt? Das ist ja mal nicht unerheblich.
Datenbank- oder Webserver auf einem Rechner zu installieren damit eine Anwendung läuft kann nie der richtige Weg sein, denn alleine dafür braucht man Admin-Rechte! Und das ist sicherlich falsch um "nur" ein Programm verwenden zu können.
Also ich für meinen Teil brauch da ein bißchen mehr Hintergrundinformationen weil Deine ANgaben viel zu schwammig sind...

03.01.2013 - 20:42 Uhr

Kennt jemand von euch das Problem das die Suchmaschine Bing die Seite per localserver versucht aufzurufen? Also als Beispiel: localserver.meineDomain.de
Ich habe das Problem nur bei einer Seite, bei den übrigen nicht. Ich finde auch im Internet nichts darüber, was ich doch sehr seltsam finde.
Ich habe jetzt schon meine Fehlerbehandlung darauf einstellen müssen so dass eine Weiterleitung statt findet weil ansonsten in der Bing suche dieser Fehler auftauscht.

Kennt das jemand?

03.01.2013 - 20:21 Uhr

Hier ist das Problem, dass er gar nicht in die Global.asax geht und mir einfach nur ne weisse Seite angezeigt wird!

Die global.asax wird auch nur einmal zur Laufzeit aufgerufen! Angelegenheiten die pro Benutzer oder Request passieren sollen/müssen dürfen nicht in die global.asax!

03.01.2013 - 20:12 Uhr

Abt: Ich frag mich, was ihr da an den Handlers rumspielt? Die haben mit den Bundles recht wenig zutun und da muss auch nichts rumgepfuscht werden.

Anfangs des Post hab ich bereits gesagt das ich mit MVC 3 bzw. 4 noch nichts gemacht habe, von daher ist es logisch das ich frage was der ErrorHandler spricht. Das fluxy von ErrorHandlern keine Ahnung hat(te) führte nur zu einer Ausschweifung. Und einen eigenen ErrorHandler zu haben hat rein gar nichts mit Pfusch zu tun, denn ohne eigenen ErrorHandler ist jede gute Seite aufgeschmissen.
Auch meine weiteren Fragen bezüglich dessen ob diese Dateien per Browser aufrufbar sind waren dann schon eher darauf ausgelegt das sie vielleicht nicht richtig eingebunden waren in das Bundling. Von daher wurde das Thema sicherlich nicht verfehlt!

Abt: Was ich jetzt aber nicht verstanden hab: Du sagst die Seite rendert nicht (was sich für mich so angehört hat, dass einfach die Dateien nicht geladen werden).

Da ist wohl der ErrorHandler doch nicht so ganz fehl am Platz...

Du hast recht; ich war das noch von der Beta gewohnt und da waren die Namen noch an die Ordner gebunden. Das ist wohl tatsächlich nicht mehr so - ist mir nie aufgefallen 😉

Wenn die eigenen Beitträge nicht 100%ig sind sollte man nicht gleich mit Steinen auf andere werfen!

fluxy:
Klappt denn jetzt alles oder nicht?