Hallo,
nach längerem melde ich mich mit meinem Projekt noch einmal zurück.
Ich habe in der Zwischenzeit die Oberfläche gebaut und mit einem Kollegen aus den USA einige Animationen erstellt.
Der Context steht und ein Login zur lokalen DB funktioniert.
Jetzt steh ich allerdings ein wenig auf dem Schlauch, wie ich nun die Daten aus der DB Anwendungsweit verfügbar habe...
Der Ablauf wäre ja so: User loggt sich ein, Seine Daten aus der DB werden abgerufen und in der View angezeigt.
Hier mal ein paar Codes:
Der DB Context:
[spoiler Name=DBContext]
[/spoiler]
Das Handling für die DB
[spoiler Name=DBHandling]
[/spoiler]
Dann das LogIn View Model
[spoiler Name=LoginViewModel]
[/spoiler]
im MainViewModel hab ich zur Zeit noch nichts drin stehen, hier müsste ich aber ja irgendwie die Daten haben um weitere Daten anzeigen zu können.
Danke Euch
nach längerem melde ich mich mit meinem Projekt noch einmal zurück.
Ich habe in der Zwischenzeit die Oberfläche gebaut und mit einem Kollegen aus den USA einige Animationen erstellt.
Der Context steht und ein Login zur lokalen DB funktioniert.
Jetzt steh ich allerdings ein wenig auf dem Schlauch, wie ich nun die Daten aus der DB Anwendungsweit verfügbar habe...
Der Ablauf wäre ja so: User loggt sich ein, Seine Daten aus der DB werden abgerufen und in der View angezeigt.
Hier mal ein paar Codes:
Der DB Context:
[spoiler Name=DBContext]
C#-Quellcode
- namespace MHoApps.Bazaar.DAL
- {
- /// <summary>
- /// die Klasse für die Verbindung zur Datenbank und das befüllen der Tabellen
- /// </summary>
- public class BazaarDbContext :DbContext
- {
- #region Private Properties
- private string conString = @"Server=(localdb)\MSSQLLocalDB;Database=BazaarDb;Trusted_Connection=True;";
- #endregion
- #region Constructor
- /// <summary>
- /// default constructor
- /// </summary>
- public BazaarDbContext()
- {}
- public BazaarDbContext(DbContextOptions<BazaarDbContext> options) : base(options)
- {}
- /// <summary>
- /// constructor mit übergabe des connection string
- /// </summary>
- /// <param name="connectionString"> der connection string zur Datenbank</param>
- public BazaarDbContext(string connectionString)
- {
- conString = connectionString;
- }
- #endregion
- #region DbSets
- /// <summary>
- /// Abbilden der Tabellen der Datenbank
- /// </summary>
- public virtual DbSet<Person> Persons { get; set; }
- public virtual DbSet<Article> Articles { get; set; }
- public virtual DbSet<BazaarEvent> BazaarEvents { get; set; }
- public virtual DbSet<LogInData> LogInData { get; set; }
- public virtual DbSet<Organization> Organizations { get; set; }
- public virtual DbSet<PersonBazaarEvent> PersonBazaarEvents { get; set; }
- #endregion
- #region Overrides
- protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
- {
- if(!optionsBuilder.IsConfigured)
- {
- optionsBuilder.UseSqlServer(conString).ConfigureWarnings(warnings => warnings.Throw(CoreEventId.IncludeIgnoredWarning));
- }
- }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.Entity<PersonBazaarEvent>().HasKey(k => new { k.BazaarEventId, k.PersonId });
- modelBuilder.Entity<PersonBazaarEvent>().HasOne(a => a.Person).WithMany(b => b.PersonBazaarEvents).HasForeignKey(c => c.PersonId);
- modelBuilder.Entity<PersonBazaarEvent>().HasOne(a => a.BazaarEvent).WithMany(b => b.Sellers).HasForeignKey(c => c.BazaarEventId);
- }
- #endregion
- }
- }
[/spoiler]
Das Handling für die DB
[spoiler Name=DBHandling]
C#-Quellcode
- namespace MHoApps.Bazaar.DAL
- {
- /// <summary>
- /// Klasse um die Datenbank mit DummyDaten zu befüllen
- /// </summary>
- public class BazaarDBHandling
- {
- #region Constructor
- public BazaarDBHandling()
- {
- }
- #endregion
- #region Initializer Methods
- public void Seed()
- {
- using (var _ctx = new BazaarDbContext())
- {
- _ctx.Database.EnsureCreated();
- if (!_ctx.Persons.Any())
- {
- // einen Verein anlegen
- var org = new Organization
- {
- Name = "Förderverein KiTa Kunterbunt e.V.",
- Street = "Freiherr-vom-Stein-Strasse 23",
- PostalCode = "56244",
- City = "Sessenhausen",
- License = LicenseTypeEnum.Pro
- };
- // den dazugehörigen Verantwortlichen anlegen
- var responsible = new Person
- {
- FirstName = "Michael",
- LastName = "Hoffmann",
- Email = "contact@mhoapps.de",
- PersonCategory = PersonCategoryEnum.Responsible,
- Organization = org,
- AccessData = new LogInData
- {
- UserName = "m.hoffmann",
- EncryptedPassword = GetMD5Hash("mh0ffm@nn"),
- Role = LogInDataRoleEnum.EventAdmin,
- IsInitialPassword = true,
- IsActive = true
- }
- };
- //ein paar Verkäufer mit Artikeln anlegen
- var sellers = new List<Person>
- {
- new Person
- {
- FirstName = "Helga",
- LastName = "Muster",
- Email = "claudia@muster.de",
- PersonCategory = PersonCategoryEnum.Seller,
- SellerNumber = 1,
- AccessData = new LogInData()
- {
- UserName = "cmuster",
- EncryptedPassword = GetMD5Hash("c.muster#2019"),
- IsInitialPassword = true,
- IsActive = true,
- Role = LogInDataRoleEnum.Seller
- },
- Articles = new List<Article>()
- {
- new Article()
- {
- ArticleNumber = 123,
- Description = "Spiel - Schnappt Hubi",
- Price = 2.5m,
- Quantity = 1,
- Sold = false
- }
- }
- },
- new Person
- {
- FirstName = "Klara",
- LastName = "Schmidt",
- Email = "klara@schmidt.de",
- PersonCategory = PersonCategoryEnum.Seller,
- SellerNumber = 2,
- AccessData = new LogInData()
- {
- UserName = "klara",
- EncryptedPassword = GetMD5Hash("schmidt"),
- IsInitialPassword = true,
- IsActive = true,
- Role = LogInDataRoleEnum.Seller
- },
- Articles = new List<Article>()
- {
- new Article()
- {
- ArticleNumber = 456,
- Description = "grüne Jacke",
- Price = 2.5m,
- Quantity = 1,
- Sold = false
- }
- }
- },
- new Person
- {
- FirstName = "Elvira",
- LastName = "Muster",
- Email = "elvira@muster.de",
- PersonCategory = PersonCategoryEnum.Seller,
- SellerNumber = 3,
- AccessData = new LogInData()
- {
- UserName = "elvira",
- EncryptedPassword = GetMD5Hash("elvira"),
- IsInitialPassword = true,
- IsActive = true,
- Role = LogInDataRoleEnum.Seller
- },
- Articles = new List<Article>()
- {
- new Article()
- {
- ArticleNumber = 311,
- Description = "Spiel - Schnappt Hubi",
- Price = 2.5m,
- Quantity = 1,
- Sold = false
- }
- }
- },
- new Person
- {
- FirstName = "Henriette",
- LastName = "Schmidt",
- Email = "henriette@schmidt.de",
- PersonCategory = PersonCategoryEnum.Seller,
- SellerNumber = 4,
- AccessData = new LogInData()
- {
- UserName = "henriette",
- EncryptedPassword = GetMD5Hash("henriette"),
- IsInitialPassword = true,
- IsActive = true,
- Role = LogInDataRoleEnum.Seller
- },
- Articles = new List<Article>()
- {
- new Article()
- {
- ArticleNumber = 456,
- Description = "grüne Jacke",
- Price = 2.5m,
- Quantity = 1,
- Sold = false
- }
- }
- },
- new Person
- {
- FirstName = "Margot",
- LastName = "Muster",
- Email = "margot@muster.de",
- PersonCategory = PersonCategoryEnum.Seller,
- SellerNumber = 5,
- AccessData = new LogInData()
- {
- UserName = "margot",
- EncryptedPassword = GetMD5Hash("margot"),
- IsInitialPassword = true,
- IsActive = true,
- Role = LogInDataRoleEnum.Seller
- },
- Articles = new List<Article>()
- {
- new Article()
- {
- ArticleNumber = 5123,
- Description = "Spiel - Schnappt Hubi",
- Price = 2.5m,
- Quantity = 1,
- Sold = false
- }
- }
- },
- new Person
- {
- FirstName = "Emma",
- LastName = "Schmidt",
- Email = "emma@schmidt.de",
- PersonCategory = PersonCategoryEnum.Seller,
- SellerNumber = 6,
- AccessData = new LogInData()
- {
- UserName = "emma",
- EncryptedPassword = GetMD5Hash("emma"),
- IsInitialPassword = true,
- IsActive = true,
- Role = LogInDataRoleEnum.Seller
- },
- Articles = new List<Article>()
- {
- new Article()
- {
- ArticleNumber = 6456,
- Description = "grüne Jacke",
- Price = 2.5m,
- Quantity = 1,
- Sold = false
- }
- }
- },
- };
- // Basare anlegen
- var aevent = new BazaarEvent
- {
- EventName = "Basar Event 1",
- EventDate = DateTime.Now.AddDays(14),
- EventToken = "E-0815-2019",
- ResponsiblePerson = responsible,
- Sellers = new List<PersonBazaarEvent>()
- };
- var bevent = new BazaarEvent
- {
- EventName = "Basar Event 2",
- EventDate = DateTime.Now.AddDays(30),
- EventToken = "E-0816-2019",
- ResponsiblePerson = responsible,
- Sellers = new List<PersonBazaarEvent>()
- };
- //die Verkäufer zu den Events hinzufügen
- aevent.Sellers.Add(new PersonBazaarEvent { BazaarEvent = aevent, Person = sellers[0] });
- aevent.Sellers.Add(new PersonBazaarEvent { BazaarEvent = aevent, Person = sellers[1] });
- aevent.Sellers.Add(new PersonBazaarEvent { BazaarEvent = aevent, Person = sellers[2] });
- bevent.Sellers.Add(new PersonBazaarEvent { BazaarEvent = bevent, Person = sellers[3] });
- bevent.Sellers.Add(new PersonBazaarEvent { BazaarEvent = bevent, Person = sellers[4] });
- bevent.Sellers.Add(new PersonBazaarEvent { BazaarEvent = bevent, Person = sellers[5] });
- //alles dem Context hinzufügen
- _ctx.Organizations.Add(org);
- _ctx.Persons.Add(responsible);
- _ctx.Persons.AddRange(sellers);
- _ctx.BazaarEvents.Add(aevent);
- _ctx.BazaarEvents.Add(bevent);
- //in die Datenbank speichern und Fehler zurückgeben falls es nicht geklappt hat
- if (_ctx.SaveChanges() < 1) throw new Exception("Unerwarteter Rückgabewert beim speichern...");
- }
- }
- }
- #endregion
- #region Data Retrieval Methods
- public void LoadResponsibleData(string user, string pass)
- {
- using (var _ctx = new BazaarDbContext())
- {
- //angemeldete Person im Context
- var person = _ctx.Persons
- .Include(org => org.Organization)
- .Include(ad => ad.AccessData)
- .Include(pbe => pbe.PersonBazaarEvents)
- .ThenInclude(ev => ev.BazaarEvent)
- .ThenInclude(resp => resp.ResponsiblePerson)
- .Include(art => art.Articles)
- .AsNoTracking()
- .Single(p => p.AccessData.UserName == user && p.AccessData.EncryptedPassword == GetMD5Hash(pass));
- //BazaarDaten für den Responsible laden
- var bazaarEvent = _ctx.BazaarEvents
- .Include(rp => rp.ResponsiblePerson) //includieren, damit Zugriff auf die Details besteht (LogIn Daten, Name usw.)
- .ThenInclude(org => org.Organization) //danach includieren um Zugriff auf die Organisation Daten zu erhalten
- .Include(pe => pe.Sellers) //Sellers ist vom Typ ICollection<PersonBazaarEvent>, muss includiert werden um an die Verkäufer ran zu kommen
- .ThenInclude(p => p.Person) //von den Verkäufern includieren um auf die Details Zugriff zu bekommen (Name, Verkäufernummer usw.)
- .ThenInclude(a => a.Articles) //wiederum von der Person der Sellers includieren um auf desen Artikel Details zu kommen (Artikelnr., Beschreibung usw.)
- .AsNoTracking()
- .Where(p => p.ResponsiblePerson == person).ToList();
- }
- }
- public bool CheckLogInData(string user, string pass)
- {
- using(var _ctx = new BazaarDbContext())
- {
- return _ctx.Persons.FirstOrDefault(p => p.AccessData.UserName == user && p.AccessData.EncryptedPassword == GetMD5Hash(pass) && p.AccessData.IsActive && !p.DeletedFlag) != null;
- }
- }
- #endregion
- #region HelperMethods
- private readonly Random rnd = new Random();
- internal string GetMD5Hash(string text)
- {
- if (string.IsNullOrEmpty(text)) return string.Empty;
- MD5 md5 = new MD5CryptoServiceProvider();
- byte[] Data = Encoding.ASCII.GetBytes(text);
- byte[] Result = md5.ComputeHash(Data);
- return BitConverter.ToString(Result);
- }
- internal string CreatePassword(int passwordLength, string AllChars = "ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz0123456789!@$?_-[](){}=§$%#&/")
- {
- return new string(Enumerable.Repeat(AllChars, passwordLength).Select(s => s[rnd.Next(s.Length)]).ToArray());
- }
- #endregion
- }
- }
Dann das LogIn View Model
[spoiler Name=LoginViewModel]
C#-Quellcode
- namespace MHoApps.Bazaar.ViewModel
- {
- /// <summary>
- /// das ViewModel für die Anmeldeseite
- /// </summary>
- public class LoginViewModel : BaseViewModel
- {
- private BazaarDBHandling _ctx = new BazaarDBHandling();
- #region Public Properties
- public string Email { get; set; }
- public bool LoginIsRunning { get; set; }
- #endregion
- #region Commands
- public ICommand LogInCommand { get; set; }
- public ICommand RegisterCommand { get; set; }
- #endregion
- #region Constructor
- /// <summary>
- /// default constructor
- /// </summary>
- public LoginViewModel()
- {
- LogInCommand = new RelayCommand(async (parameter) => await LoginAsync(parameter));
- RegisterCommand = new RelayCommand(async r => await RegisterAsync());
- }
- #endregion
- #region Command Methods
- /// <summary>
- /// den User einloggen
- /// </ summary>
- /// <param name = "parameter"> der <see cref = "SecureString" />, der aus der View für das Benutzerkennwort übergeben wurde </ param>
- /// <returns> </ returns>
- public async Task LoginAsync(object parameter)
- {
- await RunCommandAsync(() => LoginIsRunning, async () =>
- {
- var ctx = new BazaarDBHandling();
- var email = Email;
- var pass = (parameter as IHavePassword).SecurePassword.Unsecure();
- if (_ctx.CheckLogInData(email, pass))
- {
- _ctx.LoadResponsibleData(email, pass); //hier werden die Daten geladen die Anwendungsweit verfügbar sein sollen
- IoC.Get<ApplicationViewModel>().GoToPage(ApplicationPageEnum.Main, new MainViewModel());
- }
- else
- {
- await IoC.UI.ShowMessage(new MessageBoxDialogViewModel
- {
- Title = "Falsche Zugangsdaten",
- Message = "Ihre Zugangsdaten waren nicht korrekt, bitte versuchen Sie es erneut"
- });
- }
- });
- }
- /// <summary>
- /// zur Registrierungsseite wechseln
- /// </summary>
- /// <returns></returns>
- public async Task RegisterAsync()
- {
- IoC.Get<ApplicationViewModel>().GoToPage(ApplicationPageEnum.Register);
- await Task.Delay(1);
- }
- #endregion
- }
- }
im MainViewModel hab ich zur Zeit noch nichts drin stehen, hier müsste ich aber ja irgendwie die Daten haben um weitere Daten anzeigen zu können.
Danke Euch
"Hier könnte Ihre Werbung stehen..."