UpdateNavOneToOne.cs 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace SqlSugar
  8. {
  9. public partial class UpdateNavProvider<Root, T> where T : class, new() where Root : class, new()
  10. {
  11. protected bool IsDeleted { get; set; }
  12. private void UpdateOneToOne<TChild>(string name, EntityColumnInfo nav) where TChild : class, new()
  13. {
  14. var parentEntity = _ParentEntity;
  15. var parentList = _ParentList;
  16. var isManyPk = parentEntity.Columns.Count(it => it.IsPrimarykey) > 1;
  17. var parentColumn = parentEntity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name);
  18. var parentPkColumn = parentEntity.Columns.FirstOrDefault(it => it.IsPrimarykey);
  19. var thisEntity = this._Context.EntityMaintenance.GetEntityInfo<TChild>();
  20. IsDeleted = thisEntity.Columns.Any(it => it.PropertyName.EqualCase("isdeleted") || it.PropertyName.EqualCase("isdelete"));
  21. EntityColumnInfo thisPkColumn = GetPkColumnByNav(thisEntity, nav);
  22. Check.ExceptionEasy(thisPkColumn == null, $" Navigate {parentEntity.EntityName} : {name} is error ", $"导航实体 {parentEntity.EntityName} 属性 {name} 配置错误");
  23. Check.ExceptionEasy(nav.Navigat.WhereSql.HasValue(), $" {name} Navigate(NavType,WhereSql) no support update ", $"导航一对一 {name} 配置了 Sql变量 不支持更新");
  24. List<TChild> childList = new List<TChild>();
  25. foreach (var parent in parentList)
  26. {
  27. var navPropertyValue = parentColumn.PropertyInfo.GetValue(parent);
  28. var childItem = (TChild)nav.PropertyInfo.GetValue(parent);
  29. if (childItem != null)
  30. {
  31. if (IsDefaultValue(navPropertyValue))
  32. {
  33. var pkValue = thisPkColumn.PropertyInfo.GetValue(childItem);
  34. if (IsDefaultValue(navPropertyValue))
  35. {
  36. if (parentColumn.IsPrimarykey==false&&isManyPk == false && parentColumn.IsIdentity == false)
  37. {
  38. this._Context.Updateable<DbTableInfo>().AS(parentEntity.DbTableName)
  39. .SetColumns(parentColumn.DbColumnName, pkValue)
  40. .Where(parentPkColumn.DbColumnName, "=", parentPkColumn.PropertyInfo.GetValue(parent)).ExecuteCommand();
  41. }
  42. navPropertyValue = pkValue;
  43. }
  44. }
  45. if (!IsDefaultValue(navPropertyValue)&& isManyPk==false&& parentPkColumn.IsIdentity==false)
  46. {
  47. this._Context.Updateable<DbTableInfo>
  48. ().AS(parentEntity.DbTableName)
  49. .SetColumns(parentColumn.DbColumnName, navPropertyValue)
  50. .Where(parentPkColumn.DbColumnName, "=", parentPkColumn.PropertyInfo.GetValue(parent)).ExecuteCommand();
  51. }
  52. if (IsDefaultValue(navPropertyValue))
  53. {
  54. InsertDatas<TChild>(new List<TChild>() { childItem }, thisPkColumn);
  55. navPropertyValue = thisPkColumn.PropertyInfo.GetValue(childItem);
  56. parentColumn.PropertyInfo.SetValue(parent, navPropertyValue);
  57. this._Context.Updateable<DbTableInfo>
  58. ().AS(parentEntity.DbTableName)
  59. .SetColumns(parentColumn.DbColumnName, navPropertyValue)
  60. .Where(parentPkColumn.DbColumnName, "=", parentPkColumn.PropertyInfo.GetValue(parent)).ExecuteCommand();
  61. }
  62. thisPkColumn.PropertyInfo.SetValue(childItem, navPropertyValue);
  63. childList.Add(childItem);
  64. }
  65. }
  66. InsertDatas<TChild>(childList, thisPkColumn);
  67. this._ParentList = childList.Cast<object>().ToList();
  68. SetNewParent<TChild>(thisEntity, thisPkColumn);
  69. }
  70. }
  71. }