private void save(IObjectProxy proxy, System.Data.SqlClient.SqlTransaction trans = null, string tagetCol = null, object targetId = null) { var items = GetColsAndValues(proxy, trans, OperationType.Update); System.Data.SqlClient.SqlConnection con = null; if (trans != null) { con = trans.Connection; } else { con = new System.Data.SqlClient.SqlConnection(this.GetSqlCon(proxy.Model).ToString()); con.Open(); } var commnad = con.CreateCommand(); if (trans != null) { commnad.Transaction = trans; } commnad.CommandText = string.Format("UPDATE {0} SET ", proxy.Model.DataTableName); var str = SqlHelper.GetKeyCol(proxy.Model); foreach (var key in items.Keys.Where(p => p != str)) { commnad.CommandText += String.Format("\r\n {0}=@{0},", key); commnad.Parameters.AddWithValue(key, items[key]); } if (string.IsNullOrEmpty(tagetCol) == false) { if (commnad.Parameters.Contains(tagetCol) == false) { commnad.Parameters.Add(new System.Data.SqlClient.SqlParameter(tagetCol, targetId)); commnad.CommandText += String.Format("\r\n {0}=@{0},", tagetCol); } } commnad.CommandText = commnad.CommandText.Substring(0, commnad.CommandText.Length - 1); commnad.CommandText += string.Format(" WHERE {0}=@{0}", SqlHelper.GetKeyCol(proxy.Model)); commnad.Parameters.Add(new System.Data.SqlClient.SqlParameter(SqlHelper.GetKeyCol(proxy.Model), proxy.OldId ?? proxy.GetOld(proxy.Model.IdProperty))); commnad.ExecuteNonQuery(); foreach (var property in proxy.Model.Properties.Where( p => p.IsArray)) { if (proxy.GetLoadType(property) == LoadType.Complete) { dynamic proxyItems = proxy[property]; var relation = proxy.Model.Relations.First(p => p.Property == property); if (relation.RelationType == RelationType.One2Many) { foreach (IObjectProxy itemProxy in proxyItems) { if (IsExits(itemProxy, trans, relation.TargetColumn, proxy.ID) == false) { Create(itemProxy, trans, relation.TargetColumn, proxy.ID); } else { save(itemProxy, trans, relation.TargetColumn, proxy.ID); } } foreach (IObjectProxy deleteProxy in proxyItems.ToRemove) { delete(deleteProxy, trans); } } else if (relation.RelationType == RelationType.Many2Many || relation.RelationType == RelationType.Recurve) { foreach (IObjectProxy item in proxyItems) { //if (IsExits(item, trans) == false) // Create(item, trans); CreateComplexRelationBuild(proxy, trans, relation, item); } foreach (IObjectProxy item in proxyItems.ToRemove) { //if (IsExits(item, trans) == false) // Create(item, trans); DeleteComplexRelationBuild(proxy, trans, relation, item); } } } } }