diff --git a/.gitignore b/.gitignore index fb37ef2..c716105 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ /KanSan/bin/Debug/* /KanSan/obj/Debug/* /KanSan/obj/* +/KanSan.Base/bin/* +/KanSan.Base/kansan.db +/KanSan.Base/obj/* diff --git a/KanSan.Base/BaseRepository.cs b/KanSan.Base/BaseRepository.cs new file mode 100644 index 0000000..9610ffe --- /dev/null +++ b/KanSan.Base/BaseRepository.cs @@ -0,0 +1,80 @@ +using KanSan.Base.Interfaces; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace KanSan.Base +{ + public class BaseRepository : IRepository where TEntity : class + { + internal KanSanContext context; + internal DbSet dbSet; + + public BaseRepository(KanSanContext context) + { + this.context = context; + if (context == null) throw new ArgumentNullException("context"); + this.dbSet = context.Set(); + } + public virtual void Delete(TEntity entityToDelete) + { + if (context.Entry(entityToDelete).State == EntityState.Detached) + dbSet.Attach(entityToDelete); + dbSet.Remove(entityToDelete); + } + + public void Delete(object id) + { + TEntity entityToDelete = dbSet.Find(id); + Delete(entityToDelete); + } + + public IEnumerable Get(Expression> filter = null, Func, IOrderedQueryable> orderBy = null, string includeProperties = "") + { + IQueryable query = dbSet; + + if (filter != null) + { + query = query.Where(filter); + } + + if (includeProperties != null) + { + foreach (var includeProperty in includeProperties.Split + (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) + { + query = query.Include(includeProperty); + } + } + + + if (orderBy != null) + { + return orderBy(query).ToList(); + } + else + { + return query.ToList(); + } + } + + public TEntity GetByID(object id) + { + return dbSet.Find(id); + } + + public virtual void Insert(TEntity entity) + { + dbSet.Add(entity); + } + + public void Update(TEntity entityToUpdate) + { + dbSet.Attach(entityToUpdate); + context.Entry(entityToUpdate).State = EntityState.Modified; + } + } +} diff --git a/KanSan.Base/Interfaces/IRepository.cs b/KanSan.Base/Interfaces/IRepository.cs new file mode 100644 index 0000000..6a2f679 --- /dev/null +++ b/KanSan.Base/Interfaces/IRepository.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace KanSan.Base.Interfaces +{ + public interface IRepository where TEntity: class + { + void Delete(TEntity entityToDelete); + void Delete(object id); + IEnumerable Get( + Expression> filter = null, + Func, IOrderedQueryable> orderBy = null, + string includeProperties = ""); + TEntity GetByID(object id); + void Insert(TEntity entity); + void Update(TEntity entityToUpdate); + } +} diff --git a/KanSan.Base/Interfaces/IUnitOfWork.cs b/KanSan.Base/Interfaces/IUnitOfWork.cs new file mode 100644 index 0000000..0d3e2ec --- /dev/null +++ b/KanSan.Base/Interfaces/IUnitOfWork.cs @@ -0,0 +1,14 @@ +using KanSan.Base.Models; +using System; +using System.Collections.Generic; +using System.Text; + +namespace KanSan.Base.Interfaces +{ + public interface IUnitOfWork + { + IRepository BaustellenRepository { get; } + IRepository KundenRepository { get; } + void Commit(); + } +} diff --git a/KanSan.Base/KanSan.Base.csproj b/KanSan.Base/KanSan.Base.csproj new file mode 100644 index 0000000..a33c52b --- /dev/null +++ b/KanSan.Base/KanSan.Base.csproj @@ -0,0 +1,28 @@ + + + + netcoreapp3.1 + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + PreserveNewest + + + + diff --git a/KanSan.Base/KanSanContext.cs b/KanSan.Base/KanSanContext.cs new file mode 100644 index 0000000..f89243c --- /dev/null +++ b/KanSan.Base/KanSanContext.cs @@ -0,0 +1,16 @@ +using KanSan.Base.Models; +using Microsoft.EntityFrameworkCore; +using System; + +namespace KanSan.Base +{ + public class KanSanContext : DbContext + { + public DbSet Baustellen { get; set; } + public DbSet Kunden { get; set; } + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseSqlite("Data Source=kansan.db"); + } + } +} diff --git a/KanSan.Base/Migrations/20200220200339_InitialCommit.Designer.cs b/KanSan.Base/Migrations/20200220200339_InitialCommit.Designer.cs new file mode 100644 index 0000000..0a76b88 --- /dev/null +++ b/KanSan.Base/Migrations/20200220200339_InitialCommit.Designer.cs @@ -0,0 +1,87 @@ +// +using System; +using KanSan.Base; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace KanSan.Base.Migrations +{ + [DbContext(typeof(KanSanContext))] + [Migration("20200220200339_InitialCommit")] + partial class InitialCommit + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "3.1.1"); + + modelBuilder.Entity("KanSan.Base.Models.Baustelle", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("GuidNr") + .HasColumnType("TEXT"); + + b.Property("KundeID") + .HasColumnType("INTEGER"); + + b.Property("Ort") + .HasColumnType("TEXT"); + + b.Property("Projektnummer") + .HasColumnType("TEXT"); + + b.Property("Strasse") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("KundeID"); + + b.ToTable("Baustellen"); + }); + + modelBuilder.Entity("KanSan.Base.Models.Kunde", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("GuidNr") + .HasColumnType("TEXT"); + + b.Property("Nachname") + .HasColumnType("TEXT"); + + b.Property("Ort") + .HasColumnType("TEXT"); + + b.Property("PLZ") + .HasColumnType("TEXT"); + + b.Property("Strasse") + .HasColumnType("TEXT"); + + b.Property("Vorname") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("Kunden"); + }); + + modelBuilder.Entity("KanSan.Base.Models.Baustelle", b => + { + b.HasOne("KanSan.Base.Models.Kunde", "Kunde") + .WithMany("Baustellen") + .HasForeignKey("KundeID"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/KanSan.Base/Migrations/20200220200339_InitialCommit.cs b/KanSan.Base/Migrations/20200220200339_InitialCommit.cs new file mode 100644 index 0000000..727041e --- /dev/null +++ b/KanSan.Base/Migrations/20200220200339_InitialCommit.cs @@ -0,0 +1,66 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace KanSan.Base.Migrations +{ + public partial class InitialCommit : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Kunden", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + GuidNr = table.Column(nullable: false), + Vorname = table.Column(nullable: true), + Nachname = table.Column(nullable: true), + Strasse = table.Column(nullable: true), + PLZ = table.Column(nullable: true), + Ort = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Kunden", x => x.ID); + }); + + migrationBuilder.CreateTable( + name: "Baustellen", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + GuidNr = table.Column(nullable: false), + KundeID = table.Column(nullable: true), + Ort = table.Column(nullable: true), + Strasse = table.Column(nullable: true), + Projektnummer = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Baustellen", x => x.ID); + table.ForeignKey( + name: "FK_Baustellen_Kunden_KundeID", + column: x => x.KundeID, + principalTable: "Kunden", + principalColumn: "ID", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_Baustellen_KundeID", + table: "Baustellen", + column: "KundeID"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Baustellen"); + + migrationBuilder.DropTable( + name: "Kunden"); + } + } +} diff --git a/KanSan.Base/Migrations/KanSanContextModelSnapshot.cs b/KanSan.Base/Migrations/KanSanContextModelSnapshot.cs new file mode 100644 index 0000000..4ef9261 --- /dev/null +++ b/KanSan.Base/Migrations/KanSanContextModelSnapshot.cs @@ -0,0 +1,85 @@ +// +using System; +using KanSan.Base; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace KanSan.Base.Migrations +{ + [DbContext(typeof(KanSanContext))] + partial class KanSanContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "3.1.1"); + + modelBuilder.Entity("KanSan.Base.Models.Baustelle", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("GuidNr") + .HasColumnType("TEXT"); + + b.Property("KundeID") + .HasColumnType("INTEGER"); + + b.Property("Ort") + .HasColumnType("TEXT"); + + b.Property("Projektnummer") + .HasColumnType("TEXT"); + + b.Property("Strasse") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("KundeID"); + + b.ToTable("Baustellen"); + }); + + modelBuilder.Entity("KanSan.Base.Models.Kunde", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("GuidNr") + .HasColumnType("TEXT"); + + b.Property("Nachname") + .HasColumnType("TEXT"); + + b.Property("Ort") + .HasColumnType("TEXT"); + + b.Property("PLZ") + .HasColumnType("TEXT"); + + b.Property("Strasse") + .HasColumnType("TEXT"); + + b.Property("Vorname") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("Kunden"); + }); + + modelBuilder.Entity("KanSan.Base.Models.Baustelle", b => + { + b.HasOne("KanSan.Base.Models.Kunde", "Kunde") + .WithMany("Baustellen") + .HasForeignKey("KundeID"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/KanSan.Base/Models/Baustelle.cs b/KanSan.Base/Models/Baustelle.cs new file mode 100644 index 0000000..8a6b39c --- /dev/null +++ b/KanSan.Base/Models/Baustelle.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace KanSan.Base.Models +{ + public class Baustelle : DatenbankClass + { + public Kunde Kunde { get; set; } + public string Ort { get; set; } + public string Strasse { get; set; } + public string Projektnummer { get; set; } + } +} diff --git a/KanSan.Base/Models/DatenbankClass.cs b/KanSan.Base/Models/DatenbankClass.cs new file mode 100644 index 0000000..4a71bf0 --- /dev/null +++ b/KanSan.Base/Models/DatenbankClass.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace KanSan.Base.Models +{ + public class DatenbankClass + { + public int ID { get; set; } + public Guid GuidNr { get; set; } + } +} diff --git a/KanSan.Base/Models/Kunde.cs b/KanSan.Base/Models/Kunde.cs new file mode 100644 index 0000000..14df31f --- /dev/null +++ b/KanSan.Base/Models/Kunde.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace KanSan.Base.Models +{ + public class Kunde : DatenbankClass + { + public string Vorname { get; set; } + public string Nachname { get; set; } + public string Strasse { get; set; } + public string PLZ { get; set; } + public string Ort { get; set; } + public List Baustellen { get; } = new List(); + + } +} diff --git a/KanSan.Base/UnitOfWork.cs b/KanSan.Base/UnitOfWork.cs new file mode 100644 index 0000000..8a0ae1f --- /dev/null +++ b/KanSan.Base/UnitOfWork.cs @@ -0,0 +1,41 @@ +using KanSan.Base.Interfaces; +using KanSan.Base.Models; +using System; +using System.Collections.Generic; +using System.Text; + +namespace KanSan.Base +{ + public class UnitOfWork : IUnitOfWork + { + private KanSanContext _dbContext; + private BaseRepository _baustellen; + private BaseRepository _kunden; + + public UnitOfWork(KanSanContext dbContext) + { + _dbContext = dbContext; + } + + public IRepository BaustellenRepository + { + get + { + return _baustellen ?? (_baustellen = new BaseRepository(_dbContext)); + } + } + + public IRepository KundenRepository + { + get + { + return _kunden ?? (_kunden = new BaseRepository(_dbContext)); + } + } + + public void Commit() + { + _dbContext.SaveChanges(); + } + } +} diff --git a/KanSan.sln b/KanSan.sln index 5a1fbd5..7890949 100644 --- a/KanSan.sln +++ b/KanSan.sln @@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29728.190 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KanSan", "KanSan\KanSan.csproj", "{B73CD234-11F8-4FC9-BAC1-AA3DF3D7AB6A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KanSan", "KanSan\KanSan.csproj", "{B73CD234-11F8-4FC9-BAC1-AA3DF3D7AB6A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KanSan.Base", "KanSan.Base\KanSan.Base.csproj", "{2184A91C-8DFD-45DD-B83F-5D036BADEA52}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -15,6 +17,10 @@ Global {B73CD234-11F8-4FC9-BAC1-AA3DF3D7AB6A}.Debug|Any CPU.Build.0 = Debug|Any CPU {B73CD234-11F8-4FC9-BAC1-AA3DF3D7AB6A}.Release|Any CPU.ActiveCfg = Release|Any CPU {B73CD234-11F8-4FC9-BAC1-AA3DF3D7AB6A}.Release|Any CPU.Build.0 = Release|Any CPU + {2184A91C-8DFD-45DD-B83F-5D036BADEA52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2184A91C-8DFD-45DD-B83F-5D036BADEA52}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2184A91C-8DFD-45DD-B83F-5D036BADEA52}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2184A91C-8DFD-45DD-B83F-5D036BADEA52}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/KanSan/KanSan.csproj b/KanSan/KanSan.csproj index 8ebde42..9a332d1 100644 --- a/KanSan/KanSan.csproj +++ b/KanSan/KanSan.csproj @@ -22,9 +22,7 @@ - - PreserveNewest - + \ No newline at end of file diff --git a/KanSan/KanSan.csproj.user b/KanSan/KanSan.csproj.user index 644b0a6..48771d9 100644 --- a/KanSan/KanSan.csproj.user +++ b/KanSan/KanSan.csproj.user @@ -6,9 +6,23 @@ Designer + + + Code + + + Code + + Designer + + Designer + + + Designer + \ No newline at end of file diff --git a/KanSan/Klassen/Baustelle.cs b/KanSan/Klassen/Baustelle.cs deleted file mode 100644 index f3ad977..0000000 --- a/KanSan/Klassen/Baustelle.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; - -namespace KanSan.Klassen -{ - public class Baustelle - { - public Guid ID { get; set; } - public Kunde Kunde { get; set; } - public string Ort { get; set; } - public string Strasse { get; set; } - public string Projektnummer { get; set; } - - public Baustelle(Kunde kunde) - { - Kunde = kunde; - } - - public Baustelle() - { - - } - } -} \ No newline at end of file diff --git a/KanSan/Klassen/Kunde.cs b/KanSan/Klassen/Kunde.cs deleted file mode 100644 index 0fa1d8a..0000000 --- a/KanSan/Klassen/Kunde.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace KanSan.Klassen -{ - public class Kunde - { - public Guid ID { get; set; } - public string Vorname { get; set; } - public string Nachname { get; set; } - public string Strasse { get; set; } - public string PLZ { get; set; } - public string Ort { get; set; } - - public List Baustellen { get; set; } = new List(); - - public void NeueBaustelle(KanSanContext ksc,string ort, string strasse, string projektnummer) - { - Baustelle baustelle = new Baustelle(this) - { - Ort = ort, - ID = Guid.NewGuid(), - Projektnummer = projektnummer, - Strasse = strasse - }; - //Baustellen.Add(baustelle); - ksc.Add(baustelle); - ksc.SaveChanges(); - } - } -} \ No newline at end of file diff --git a/KanSan/Klassen/Leistungsverzeichnis.cs b/KanSan/Klassen/Leistungsverzeichnis.cs deleted file mode 100644 index 4e54bc5..0000000 --- a/KanSan/Klassen/Leistungsverzeichnis.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; - -namespace KanSan.Klassen -{ - public class Leistungsverzeichnis - { - public Guid ID { get; set; } - public string Beschreibung { get; set; } - public List Positionen { get; set; } - public Leistungsverzeichnis(string beschreibung) - { - ID = Guid.NewGuid(); - Beschreibung = beschreibung; - } - - public void AddLeistungsverzeichnisPosition(string Positionnummer,string PositionsBeschreibung,string PositionEinheit, decimal PositionEinheitpreis) - { - if (Positionen == null) Positionen = new List(); - LeistungsverzeichnisPosition pos = new LeistungsverzeichnisPosition(); - pos.ID = Guid.NewGuid(); - pos.ref_leistungsverzeichnis = this; - pos.Position = Positionnummer; - pos.PositionBeschreibung = PositionsBeschreibung; - pos.PositionEinheit = PositionEinheit; - pos.PositionEinheitspreis = PositionEinheitpreis; - - Positionen.Add(pos); - } - } - - public class LeistungsverzeichnisPosition - { - public Guid ID { get; set; } - public Leistungsverzeichnis ref_leistungsverzeichnis { get; set; } - public string Position { get; set; } - public string PositionBeschreibung { get; set; } - public string PositionEinheit { get; set; } - public decimal PositionEinheitspreis { get; set; } - } -} \ No newline at end of file diff --git a/KanSan/Klassen/LeistungsverzeichnisBaustelle.cs b/KanSan/Klassen/LeistungsverzeichnisBaustelle.cs deleted file mode 100644 index 060d8f8..0000000 --- a/KanSan/Klassen/LeistungsverzeichnisBaustelle.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace KanSan.Klassen -{ - public class LeistungsverzeichnisBaustelle - { - public int LeistungsverzeichnisBaustelleID { get; set; } - public Baustelle Baustelle { get; set; } - public Leistungsverzeichnis Leistungsverzeichniss { get; set; } - } -} \ No newline at end of file diff --git a/KanSan/MainWindow.xaml b/KanSan/MainWindow.xaml index d58f630..e60fc24 100644 --- a/KanSan/MainWindow.xaml +++ b/KanSan/MainWindow.xaml @@ -8,9 +8,6 @@ mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> - - -