diff --git a/Elwig/Windows/BaseDataWindow.xaml.AreaCom.cs b/Elwig/Windows/BaseDataWindow.xaml.AreaCom.cs index e4ba93a..5a891d5 100644 --- a/Elwig/Windows/BaseDataWindow.xaml.AreaCom.cs +++ b/Elwig/Windows/BaseDataWindow.xaml.AreaCom.cs @@ -47,26 +47,26 @@ namespace Elwig.Windows { if (!_actChanged || _actList == null || _acts == null || _actIds == null) return; - foreach (var (vtrgid, _) in _acts.Where(a => a.Value == null)) { - ctx.Remove(ctx.AreaCommitmentTypes.Find(vtrgid)!); - } - foreach (var (attr, old) in _actIds) { - attr.VtrgId = old; - } - foreach (var (old, vtrgid) in _acts.Where(a => a.Value != null)) { - ctx.Update(ctx.AreaCommitmentTypes.Find(old)!); - } - await ctx.SaveChangesAsync(); + // delete + var delete = _acts.Where(a => a.Value == null).Select(a => a.Key).ToList(); + await ctx.AreaCommitmentTypes.Where(v => delete.Contains(v.VtrgId)).ExecuteDeleteAsync(); - foreach (var (old, vtrgid) in _acts.Where(a => a.Value != null)) { + // update + ctx.UpdateRange(_actList + .Where(_actIds.ContainsKey) + .Select(t => { + t.VtrgId = _actIds[t]; + ctx.Entry(t).State = EntityState.Added; + return t; + })); + await ctx.SaveChangesAsync(); + foreach (var (old, vtrgid) in _acts.Where(a => a.Value != null && a.Key != a.Value)) { await ctx.Database.ExecuteSqlAsync($"UPDATE area_commitment_type SET vtrgid = {vtrgid} WHERE vtrgid = {old}"); } - await ctx.SaveChangesAsync(); - foreach (var type in _actList.Where(a => !_actIds.ContainsKey(a))) { - if (type.VtrgId == null) continue; - ctx.Add(type); - } + // insert + ctx.AddRange(_actList + .Where(t => !_actIds.ContainsKey(t) && t.VtrgId != null)); await ctx.SaveChangesAsync(); } @@ -125,7 +125,7 @@ namespace Elwig.Windows { var id = AreaCommitmentTypeIdInput.Text; if (old != null) _acts[old] = id; attr.VtrgId = id; - attr.SortId = v?.SortId; + attr.SortId = v?.SortId ?? ""; attr.AttrId = a?.AttrId; attr.MinKgPerHa = AreaCommitmentTypeMinKgPerHaInput.Text.Length > 0 ? int.Parse(AreaCommitmentTypeMinKgPerHaInput.Text) : null; attr.PenaltyPerKg = AreaCommitmentTypePenaltyPerKgInput.Text.Length > 0 ? decimal.Parse(AreaCommitmentTypePenaltyPerKgInput.Text) : null; diff --git a/Elwig/Windows/BaseDataWindow.xaml.Branch.cs b/Elwig/Windows/BaseDataWindow.xaml.Branch.cs index d8ca39d..a5f7e2a 100644 --- a/Elwig/Windows/BaseDataWindow.xaml.Branch.cs +++ b/Elwig/Windows/BaseDataWindow.xaml.Branch.cs @@ -41,25 +41,26 @@ namespace Elwig.Windows { if (!_branchChanged || _branchList == null || _branches == null || _branchIds == null) return; + // delete var deleteZwstIds = _branches.Where(b => b.Value == null).Select(b => b.Key).ToList(); await ctx.Branches.Where(b => deleteZwstIds.Contains(b.ZwstId)).ExecuteDeleteAsync(); - foreach (var (branch, old) in _branchIds) { - branch.ZwstId = old; - } - foreach (var (old, zwstid) in _branches.Where(b => b.Value != null)) { - ctx.Update(ctx.Branches.Find(old)!); - } + // update + ctx.UpdateRange(_branchList + .Where(_branchIds.ContainsKey) + .Select(b => { + b.ZwstId = _branchIds[b]; + ctx.Entry(b).State = EntityState.Added; + return b; + })); await ctx.SaveChangesAsync(); - - foreach (var (old, zwstid) in _branches.Where(b => b.Value != null)) { + foreach (var (old, zwstid) in _branches.Where(b => b.Value != null && b.Key != b.Value)) { await ctx.Database.ExecuteSqlAsync($"UPDATE branch SET zwstid = {zwstid} WHERE zwstid = {old}"); } - foreach (var branch in _branchList.Where(b => !_branchIds.ContainsKey(b))) { - if (branch.ZwstId == null) continue; - ctx.Add(branch); - } + // insert + ctx.AddRange(_branchList + .Where(b => !_branchIds.ContainsKey(b) && b.ZwstId != null)); await ctx.SaveChangesAsync(); } diff --git a/Elwig/Windows/BaseDataWindow.xaml.Mod.cs b/Elwig/Windows/BaseDataWindow.xaml.Mod.cs index d97b70d..e88eedd 100644 --- a/Elwig/Windows/BaseDataWindow.xaml.Mod.cs +++ b/Elwig/Windows/BaseDataWindow.xaml.Mod.cs @@ -48,30 +48,30 @@ namespace Elwig.Windows { if (!_modChanged || _modList == null || _mods == null || _modIds == null) return; + var year = (SeasonList.SelectedItem as Season)?.Year; int i = 0; foreach (var mod in _modList) mod.Ordering = ++i; - var year = (SeasonList.SelectedItem as Season)?.Year; - foreach (var (modid, _) in _mods.Where(m => m.Value == null)) { - ctx.Remove(ctx.Modifiers.Find(year, modid)!); - } - foreach (var (mod, old) in _modIds) { - mod.ModId = old; - } - foreach (var (old, modid) in _mods.Where(m => m.Value != null)) { - ctx.Update(ctx.Modifiers.Find(year, old)!); - } - await ctx.SaveChangesAsync(); + // delete + var deleteModIds = _mods.Where(b => b.Value == null).Select(b => b.Key).ToList(); + await ctx.Modifiers.Where(b => b.Year == year && deleteModIds.Contains(b.ModId)).ExecuteDeleteAsync(); + // update + ctx.UpdateRange(_modList + .Where(_modIds.ContainsKey) + .Select(m => { + m.ModId = _modIds[m]; + ctx.Entry(m).State = EntityState.Added; + return m; + })); + await ctx.SaveChangesAsync(); foreach (var (old, modid) in _mods.Where(m => m.Value != null)) { await ctx.Database.ExecuteSqlAsync($"UPDATE modifier SET modid = {modid} WHERE (year, modid) = ({year}, {old})"); } - await ctx.SaveChangesAsync(); - foreach (var mod in _modList.Where(m => !_modIds.ContainsKey(m))) { - if (mod.ModId == null) continue; - await ctx.AddAsync(mod); - } + // insert + ctx.AddRange(_modList + .Where(m => !_modIds.ContainsKey(m) && m.ModId != null)); await ctx.SaveChangesAsync(); } diff --git a/Elwig/Windows/BaseDataWindow.xaml.WineAttr.cs b/Elwig/Windows/BaseDataWindow.xaml.WineAttr.cs index fee5033..623edf5 100644 --- a/Elwig/Windows/BaseDataWindow.xaml.WineAttr.cs +++ b/Elwig/Windows/BaseDataWindow.xaml.WineAttr.cs @@ -41,26 +41,28 @@ namespace Elwig.Windows { if (!_attrChanged || _attrList == null || _attrs == null || _attrIds == null) return; + // delete var deleteAttrIds = _attrs.Where(a => a.Value == null).Select(a => a.Key).ToList(); await ctx.WineAttributes.Where(a => deleteAttrIds.Contains(a.AttrId)).ExecuteDeleteAsync(); - foreach (var (attr, old) in _attrIds) { - attr.AttrId = old; - } - foreach (var (old, attrid) in _attrs.Where(a => a.Value != null)) { - ctx.Update(ctx.WineAttributes.Find(old)!); - } - await ctx.SaveChangesAsync(); + // update + ctx.UpdateRange(_attrList + .Where(_attrIds.ContainsKey) + .Select(a => { + a.AttrId = _attrIds[a]; + ctx.Entry(a).State = EntityState.Added; + return a; + })); + await ctx.SaveChangesAsync(); foreach (var (old, attrid) in _attrs.Where(a => a.Value != null)) { await ctx.Database.ExecuteSqlAsync($"UPDATE wine_attribute SET attrid = {attrid} WHERE attrid = {old}"); await ctx.Database.ExecuteSqlAsync($"UPDATE area_commitment_type SET vtrgid = (sortid || COALESCE(attrid, '') || COALESCE(disc, '')) WHERE attrid = {attrid}"); - await ctx.Database.ExecuteSqlRawAsync($"UPDATE payment_variant SET data = REPLACE(REPLACE(data, '/{old}\"', '/{attrid}\"'), '/{old}-', '/{attrid}-')"); + await ctx.Database.ExecuteSqlAsync($"UPDATE payment_variant SET data = REPLACE(REPLACE(data, {$"/{old}\""}, {$"/{attrid}\""}), {$"/{old}-"}, {$"/{attrid}-"})"); } - foreach (var attr in _attrList.Where(a => !_attrIds.ContainsKey(a))) { - if (attr.AttrId == null) continue; - ctx.Add(attr); - } + // insert + ctx.AddRange(_attrList + .Where(a => !_attrIds.ContainsKey(a) && a.AttrId != null)); await ctx.SaveChangesAsync(); } diff --git a/Elwig/Windows/BaseDataWindow.xaml.WineCult.cs b/Elwig/Windows/BaseDataWindow.xaml.WineCult.cs index 29321b5..d724cd9 100644 --- a/Elwig/Windows/BaseDataWindow.xaml.WineCult.cs +++ b/Elwig/Windows/BaseDataWindow.xaml.WineCult.cs @@ -41,25 +41,27 @@ namespace Elwig.Windows { if (!_cultChanged || _cultList == null || _cults == null || _cultIds == null) return; + // delete var deleteCultIds = _cults.Where(c => c.Value == null).Select(c => c.Key).ToList(); await ctx.WineCultivations.Where(c => deleteCultIds.Contains(c.CultId)).ExecuteDeleteAsync(); - foreach (var (cult, old) in _cultIds) { - cult.CultId = old; - } - foreach (var (old, cultid) in _cults.Where(c => c.Value != null)) { - ctx.Update(ctx.WineCultivations.Find(old)!); - } - await ctx.SaveChangesAsync(); + // update + ctx.UpdateRange(_cultList + .Where(_cultIds.ContainsKey) + .Select(c => { + c.CultId = _cultIds[c]; + ctx.Entry(c).State = EntityState.Added; + return c; + })); + await ctx.SaveChangesAsync(); foreach (var (old, cultid) in _cults.Where(c => c.Value != null)) { await ctx.Database.ExecuteSqlAsync($"UPDATE wine_cultivation SET cultid = {cultid} WHERE cultid = {old}"); - await ctx.Database.ExecuteSqlRawAsync($"UPDATE payment_variant SET data = REPLACE(data, '-{old}\"', '-{cultid}\"')"); + await ctx.Database.ExecuteSqlAsync($"UPDATE payment_variant SET data = REPLACE(data, {$"-{old}\""}, {$"-{cultid}\""})"); } - foreach (var cult in _cultList.Where(c => !_cultIds.ContainsKey(c))) { - if (cult.CultId == null) continue; - ctx.Add(cult); - } + // insert + ctx.AddRange(_cultList + .Where(c => !_cultIds.ContainsKey(c) && c.CultId != null)); await ctx.SaveChangesAsync(); } diff --git a/Elwig/Windows/BaseDataWindow.xaml.cs b/Elwig/Windows/BaseDataWindow.xaml.cs index d39b316..75a295a 100644 --- a/Elwig/Windows/BaseDataWindow.xaml.cs +++ b/Elwig/Windows/BaseDataWindow.xaml.cs @@ -12,8 +12,6 @@ using System.Windows.Input; namespace Elwig.Windows { public partial class BaseDataWindow : AdministrationWindow { - protected AppDbContext? EditContext; - public BaseDataWindow() { InitializeComponent(); RequiredInputs = [ @@ -189,31 +187,30 @@ namespace Elwig.Windows { } private async Task InitEditing() { - EditContext = new AppDbContext(); - await BranchesInitEditing(EditContext); - await WineAttributesInitEditing(EditContext); - await WineCultivationsInitEditing(EditContext); - await AreaCommitmentTypesInitEditing(EditContext); - await SeasonsInitEditing(EditContext); - await ModifiersInitEditing(EditContext); + using var ctx = new AppDbContext(); + await BranchesInitEditing(ctx); + await WineAttributesInitEditing(ctx); + await WineCultivationsInitEditing(ctx); + await AreaCommitmentTypesInitEditing(ctx); + await SeasonsInitEditing(ctx); + await ModifiersInitEditing(ctx); } private async Task Save() { await UpdateClientParameters(App.Client); await UpdateParameters(Utils.CurrentLastSeason); - using var tx = await EditContext!.Database.BeginTransactionAsync(); - await BranchesSave(EditContext!); - await WineAttributesSave(EditContext!); - await WineCultivationsSave(EditContext!); - await AreaCommitmentTypesSave(EditContext!); - await SeasonsSave(EditContext!); - await ModifiersSave(EditContext!); + using var ctx = new AppDbContext(); + using var tx = await ctx.Database.BeginTransactionAsync(); + await BranchesSave(ctx); + await WineAttributesSave(ctx); + await WineCultivationsSave(ctx); + await AreaCommitmentTypesSave(ctx); + await SeasonsSave(ctx); + await ModifiersSave(ctx); await tx.CommitAsync(); } private async Task FinishEditing() { - EditContext?.Dispose(); - EditContext = null; using var ctx = new AppDbContext(); await BranchesFinishEditing(ctx); await WineAttributesFinishEditing(ctx);