InsertNavProviderOneToOne.cs 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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 InsertNavProvider<Root, T> where T : class, new() where Root : class, new()
  10. {
  11. private void InsertOneToOne<TChild>(string name, EntityColumnInfo nav) where TChild : class, new()
  12. {
  13. var parentEntity = _ParentEntity;
  14. var parentList = _ParentList;
  15. var parentColumn = parentEntity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name);
  16. var parentPkColumn = parentEntity.Columns.FirstOrDefault(it => it.IsPrimarykey);
  17. var thisEntity = this._Context.EntityMaintenance.GetEntityInfo<TChild>();
  18. EntityColumnInfo thisPkColumn = GetPkColumnByNav(thisEntity, nav);
  19. Check.ExceptionEasy(thisPkColumn == null, $" Navigate {parentEntity.EntityName} : {name} is error ", $"导航实体 {parentEntity.EntityName} 属性 {name} 配置错误");
  20. Check.ExceptionEasy(nav.Navigat.WhereSql.HasValue(), $" {name} Navigate(NavType,WhereSql) no support insert ", $"导航一对一 {name} 配置了 Sql变量 不支持插入");
  21. List<TChild> childList = new List<TChild>();
  22. foreach (var parent in parentList)
  23. {
  24. var navPropertyValue = parentColumn.PropertyInfo.GetValue(parent);
  25. var childItem = (TChild)nav.PropertyInfo.GetValue(parent);
  26. if (childItem != null)
  27. {
  28. if (IsDefaultValue(navPropertyValue))
  29. {
  30. var pkValue = thisPkColumn.PropertyInfo.GetValue(childItem);
  31. if (IsDefaultValue(navPropertyValue))
  32. {
  33. navPropertyValue = pkValue;
  34. }
  35. }
  36. if (!IsDefaultValue(navPropertyValue)&& parentColumn.IsPrimarykey==false)
  37. {
  38. this._Context.Updateable<DbTableInfo>
  39. ().AS(parentEntity.DbTableName)
  40. .SetColumns(parentColumn.DbColumnName, navPropertyValue)
  41. .Where(parentPkColumn.DbColumnName, "=", parentPkColumn.PropertyInfo.GetValue(parent)).ExecuteCommand();
  42. }
  43. if (IsDefaultValue(navPropertyValue))
  44. {
  45. InsertDatas<TChild>(new List<TChild>() { childItem }, thisPkColumn);
  46. navPropertyValue = thisPkColumn.PropertyInfo.GetValue(childItem);
  47. parentColumn.PropertyInfo.SetValue(parent,navPropertyValue);
  48. this._Context.Updateable<DbTableInfo>
  49. ().AS(parentEntity.DbTableName)
  50. .SetColumns(parentColumn.DbColumnName, navPropertyValue)
  51. .Where(parentPkColumn.DbColumnName,"=", parentPkColumn.PropertyInfo.GetValue(parent)).ExecuteCommand();
  52. }
  53. thisPkColumn.PropertyInfo.SetValue(childItem, navPropertyValue);
  54. childList.Add(childItem);
  55. }
  56. }
  57. InsertDatas<TChild>(childList,thisPkColumn);
  58. this._ParentList = childList.Cast<object>().ToList();
  59. SetNewParent<TChild>(thisEntity, thisPkColumn);
  60. }
  61. }
  62. }