diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs index efeb31fb1..838252f32 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs @@ -11,7 +11,7 @@ namespace SqlSugar { public List Roots { get; set; } - public object ParentList { get; set; } + public List ParentList { get; set; } public EntityInfo ParentEntity { get; set; } public SqlSugarProvider Context { get; set; } @@ -19,7 +19,7 @@ namespace SqlSugar { if (ParentList == null) { - ParentList = GetParentList(Roots); + ParentList = GetParentList(Roots).Cast().ToList(); } var name=ExpressionTool.GetMemberName(expression); var nav = this.ParentEntity.Columns.FirstOrDefault(x => x.PropertyName == name); @@ -29,7 +29,7 @@ namespace SqlSugar } if (nav.Navigat.NavigatType == NavigateType.OneToOne || nav.Navigat.NavigatType == NavigateType.ManyToOne) { - InsertOneToOne(); + InsertOneToOne(ParentList,this.ParentEntity, name,nav); } else if (nav.Navigat.NavigatType == NavigateType.OneToMany) { @@ -52,9 +52,40 @@ namespace SqlSugar } - private void InsertOneToOne() + private void InsertOneToOne(List parentList, EntityInfo parentEntity, string name, EntityColumnInfo nav) { - + var parentColumn = parentEntity.Columns.FirstOrDefault(it => it.PropertyName==nav.Navigat.Name); + this.ParentEntity = this.Context.EntityMaintenance.GetEntityInfo(); + var pkColumn = ParentEntity.Columns.FirstOrDefault(it=>it.IsPrimarykey==true); + if (nav.Navigat.Name2.HasValue()) + { + pkColumn = ParentEntity.Columns.FirstOrDefault(it => it.PropertyName==nav.Navigat.Name2); + } + Check.Exception(pkColumn == null, $" Navigate {parentEntity.EntityName} : {name} is error ", $"导航实体 {parentEntity.EntityName} 属性 {name} 配置错误"); + List childList = new List(); + foreach (var parent in parentList) + { + var childItems=(TChild)nav.PropertyInfo.GetValue(parent); + if (childItems != null) + { + var pkValue = pkColumn.PropertyInfo.GetValue(childItems); + var pvValue = parentColumn.PropertyInfo.GetValue(parent); + if (IsDefaultValue(pvValue)) + { + pvValue = pkValue; + } + if (IsDefaultValue(pvValue)) + { + + } + } + } + parentList = childList; + } + + private static bool IsDefaultValue(object pvValue) + { + return pvValue == null || pvValue == UtilMethods.GetDefaultValue(pvValue.GetType()); } private List GetParentList(List datas) where Type : class ,new() diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs index 7cbd819a4..a1d01657f 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs @@ -335,6 +335,15 @@ namespace SqlSugar UpdateBuilder.Parameters.Add(new SugarParameter(parameterName, fieldValue)); UpdateBuilder.SetValues.Add(new KeyValuePair(SqlBuilder.GetTranslationColumnName(fieldName), $"{SqlBuilder.GetTranslationColumnName(fieldName)}={parameterName}")); this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => (UpdateParameterIsNull == false && IsPrimaryKey(it)) || UpdateBuilder.SetValues.Any(v => SqlBuilder.GetNoTranslationColumnName(v.Key).Equals(it.DbColumnName, StringComparison.CurrentCultureIgnoreCase) || SqlBuilder.GetNoTranslationColumnName(v.Key).Equals(it.PropertyName, StringComparison.CurrentCultureIgnoreCase)) || it.IsPrimarykey == true).ToList(); + if (!this.UpdateBuilder.DbColumnInfoList.Any(it => it.DbColumnName.EqualCase(fieldName))) + { + this.UpdateBuilder.DbColumnInfoList.Add(new DbColumnInfo() + { + DbColumnName=fieldName, + Value=fieldValue, + PropertyName=fieldName + }); + } AppendSets(); return this; } diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/Dm/DmProvider.cs b/Src/Asp.NetCore2/SqlSugar/Realization/Dm/DmProvider.cs index eb495c950..2bf1446ee 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/Dm/DmProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/Dm/DmProvider.cs @@ -121,7 +121,8 @@ namespace SqlSugar if (sqlParameter.DbType == System.Data.DbType.Guid) { sqlParameter.DbType = System.Data.DbType.String; - sqlParameter.Value = sqlParameter.Value.ToString(); + if(sqlParameter.Value != DBNull.Value) + sqlParameter.Value = sqlParameter.Value.ToString(); } if (parameter.Direction == 0) { diff --git a/Src/Asp.NetCore2/SqlSugar/Utilities/UtilMethods.cs b/Src/Asp.NetCore2/SqlSugar/Utilities/UtilMethods.cs index 3ee26c61e..365f6fc22 100644 --- a/Src/Asp.NetCore2/SqlSugar/Utilities/UtilMethods.cs +++ b/Src/Asp.NetCore2/SqlSugar/Utilities/UtilMethods.cs @@ -216,6 +216,10 @@ namespace SqlSugar Type type = Nullable.GetUnderlyingType(oldType); return type == null ? oldType : type; } + public static object GetDefaultValue(Type type) + { + return type.IsValueType ? Activator.CreateInstance(type) : null; + } public static string ReplaceSqlParameter(string itemSql, SugarParameter itemParameter, string newName) { itemSql = Regex.Replace(itemSql, string.Format(@"{0} ", "\\" + itemParameter.ParameterName), newName + " ", RegexOptions.IgnoreCase);