public async Task DeleteEntity(RunTimeMetadata metadata, RowInfo rowInfo) { DbSetInfo dbSetInfo = rowInfo.GetDbSetInfo(); if (rowInfo.changeType != ChangeType.Deleted) { throw new DomainServiceException(string.Format(ErrorStrings.ERR_REC_CHANGETYPE_INVALID, dbSetInfo.GetEntityType().Name, rowInfo.changeType)); } MethodInfoData methodData = metadata.GetOperationMethodInfo(dbSetInfo.dbSetName, MethodType.Delete); if (methodData == null) { throw new DomainServiceException(string.Format(ErrorStrings.ERR_DB_DELETE_NOT_IMPLEMENTED, dbSetInfo.GetEntityType().Name, GetType().Name)); } object dbEntity = Activator.CreateInstance(dbSetInfo.GetEntityType()); UpdateEntityFromRowInfo(dbEntity, rowInfo, true); rowInfo.GetChangeState().Entity = dbEntity; rowInfo.GetChangeState().OriginalEntity = dbEntity; object instance = GetMethodOwner(methodData); object res = methodData.MethodInfo.Invoke(instance, new[] { dbEntity }); if (res is Task) { await(res as Task); } }
public async Task UpdateEntity(RunTimeMetadata metadata, RowInfo rowInfo) { DbSetInfo dbSetInfo = rowInfo.GetDbSetInfo(); if (rowInfo.changeType != ChangeType.Updated) { throw new DomainServiceException(string.Format(ErrorStrings.ERR_REC_CHANGETYPE_INVALID, dbSetInfo.GetEntityType().Name, rowInfo.changeType)); } MethodInfoData methodData = metadata.GetOperationMethodInfo(dbSetInfo.dbSetName, MethodType.Update); if (methodData == null) { throw new DomainServiceException(string.Format(ErrorStrings.ERR_DB_UPDATE_NOT_IMPLEMENTED, dbSetInfo.GetEntityType().Name, GetType().Name)); } object dbEntity = Activator.CreateInstance(dbSetInfo.GetEntityType()); UpdateEntityFromRowInfo(dbEntity, rowInfo, false); object original = GetOriginalEntity(dbEntity, rowInfo); rowInfo.GetChangeState().Entity = dbEntity; rowInfo.GetChangeState().OriginalEntity = original; object instance = GetMethodOwner(methodData); //apply this changes to entity that is in the database (this is done in user domain service method) object res = methodData.MethodInfo.Invoke(instance, new[] { dbEntity }); if (res is Task) { await(res as Task); } }
private static string CreateDbSetMethods(DbSetInfo dbSetInfo, string tableName) { var sb = new StringBuilder(512); sb.AppendLine(string.Format("#region {0}", dbSetInfo.dbSetName)); sb.AppendLine("[Query]"); sb.AppendFormat("public QueryResult<{0}> Read{1}()", dbSetInfo.GetEntityType().Name, dbSetInfo.dbSetName); sb.AppendLine(""); sb.AppendLine("{"); sb.AppendLine("\tint? totalCount = null;"); sb.AppendLine(string.Format("\tvar res = this.PerformQuery(this.DB.{0}, ref totalCount).AsEnumerable();", tableName)); sb.AppendLine(string.Format("\treturn new QueryResult<{0}>(res, totalCount);", dbSetInfo.GetEntityType().Name)); sb.AppendLine("}"); sb.AppendLine(""); sb.AppendLine("[Insert]"); sb.AppendFormat("public void Insert{1}({0} {2})", dbSetInfo.GetEntityType().Name, dbSetInfo.dbSetName, dbSetInfo.dbSetName.ToLower()); sb.AppendLine(""); sb.AppendLine("{"); sb.AppendLine(string.Format("\tif (({0}.EntityState != EntityState.Detached))", dbSetInfo.dbSetName.ToLower())); sb.AppendLine("\t{"); sb.AppendLine(string.Format("\t\tthis.DB.ObjectStateManager.ChangeObjectState({0}, EntityState.Added);", dbSetInfo.dbSetName.ToLower())); sb.AppendLine("\t}"); sb.AppendLine("\telse"); sb.AppendLine("\t{"); sb.AppendLine(string.Format("\t\tthis.DB.{0}.AddObject({1});", tableName, dbSetInfo.dbSetName.ToLower())); sb.AppendLine("\t}"); sb.AppendLine("}"); sb.AppendLine(""); sb.AppendLine("[Update]"); sb.AppendFormat("public void Update{1}({0} {2})", dbSetInfo.GetEntityType().Name, dbSetInfo.dbSetName, dbSetInfo.dbSetName.ToLower()); sb.AppendLine(""); sb.AppendLine("{"); sb.AppendLine(string.Format("\t{0} orig = this.GetOriginal<{0}>();", dbSetInfo.GetEntityType().Name)); sb.AppendLine(string.Format("\tthis.DB.{0}.Attach({1});", tableName, dbSetInfo.dbSetName.ToLower())); sb.AppendLine(string.Format("\tthis.DB.{0}.ApplyOriginalValues(orig);", tableName)); sb.AppendLine("}"); sb.AppendLine(""); sb.AppendLine("[Delete]"); sb.AppendFormat("public void Delete{1}({0} {2})", dbSetInfo.GetEntityType().Name, dbSetInfo.dbSetName, dbSetInfo.dbSetName.ToLower()); sb.AppendLine(""); sb.AppendLine("{"); sb.AppendLine(string.Format("\tif (({0}.EntityState != EntityState.Detached))", dbSetInfo.dbSetName.ToLower())); sb.AppendLine("\t{"); sb.AppendLine(string.Format("\t\tthis.DB.ObjectStateManager.ChangeObjectState({0}, EntityState.Deleted);", dbSetInfo.dbSetName.ToLower())); sb.AppendLine("\t}"); sb.AppendLine("\telse"); sb.AppendLine("\t{"); sb.AppendLine(string.Format("\t\tthis.DB.{0}.Attach({1});", tableName, dbSetInfo.dbSetName.ToLower())); sb.AppendLine(string.Format("\t\tthis.DB.{0}.DeleteObject({1});", tableName, dbSetInfo.dbSetName.ToLower())); sb.AppendLine("\t}"); sb.AppendLine("}"); sb.AppendLine(""); sb.AppendLine("#endregion"); return(sb.ToString()); }
public async Task Invoke(CRUDContext <TService> ctx) { IAuthorizer <TService> authorizer = ctx.ServiceContainer.GetAuthorizer(); RunTimeMetadata metadata = ctx.Service.GetMetadata(); foreach (DbSet dbSet in ctx.Request.dbSets) { //methods on domain service which are attempted to be executed by client (SaveChanges triggers their execution) Dictionary <string, MethodInfoData> domainServiceMethods = new Dictionary <string, MethodInfoData>(); DbSetInfo dbInfo = metadata.DbSets[dbSet.dbSetName]; dbSet.rows.Aggregate <RowInfo, Dictionary <string, MethodInfoData> >(domainServiceMethods, (dict, rowInfo) => { MethodInfoData method = rowInfo.GetCRUDMethodInfo(metadata, dbInfo.dbSetName); if (method == null) { throw new DomainServiceException(string.Format(ErrorStrings.ERR_REC_CHANGETYPE_INVALID, dbInfo.GetEntityType().Name, rowInfo.changeType)); } string dicKey = string.Format("{0}:{1}", method.OwnerType.FullName, method.MethodInfo.Name); if (!dict.ContainsKey(dicKey)) { dict.Add(dicKey, method); } return(dict); }); await authorizer.CheckUserRightsToExecute(domainServiceMethods.Values); } await _next(ctx); }
private void CheckRowInfo(RowInfo rowInfo) { DbSetInfo dbSetInfo = rowInfo.GetDbSetInfo(); if (dbSetInfo.GetEntityType() == null) { throw new DomainServiceException(string.Format(ErrorStrings.ERR_DB_ENTITYTYPE_INVALID, dbSetInfo.dbSetName)); } if (rowInfo.changeType == ChangeType.None) { throw new DomainServiceException(string.Format(ErrorStrings.ERR_REC_CHANGETYPE_INVALID, dbSetInfo.GetEntityType().Name, rowInfo.changeType)); } }
private static string CreateDbSetMethods(DbSetInfo dbSetInfo, string tableName) { StringBuilder sb = new StringBuilder(512); sb.AppendLine(string.Format("#region {0}", dbSetInfo.dbSetName)); sb.AppendLine("[Query]"); sb.AppendFormat("public QueryResult<{0}> Read{1}()", dbSetInfo.GetEntityType().Name, dbSetInfo.dbSetName); sb.AppendLine(""); sb.AppendLine("{"); sb.AppendLine("\tint? totalCount = null;"); sb.AppendLine(string.Format("\tvar res = this.PerformQuery(this.DB.{0}, ref totalCount).AsEnumerable();", tableName)); sb.AppendLine(string.Format("\treturn new QueryResult<{0}>(res, totalCount);", dbSetInfo.GetEntityType().Name)); sb.AppendLine("}"); sb.AppendLine(""); sb.AppendLine("[Insert]"); sb.AppendFormat("public void Insert{1}({0} {2})", dbSetInfo.GetEntityType().Name, dbSetInfo.dbSetName, dbSetInfo.dbSetName.ToLower()); sb.AppendLine(""); sb.AppendLine("{"); sb.AppendLine(string.Format("\tthis.DB.{0}.Add({1});", tableName, dbSetInfo.dbSetName.ToLower())); sb.AppendLine("}"); sb.AppendLine(""); sb.AppendLine("[Update]"); sb.AppendFormat("public void Update{1}({0} {2})", dbSetInfo.GetEntityType().Name, dbSetInfo.dbSetName, dbSetInfo.dbSetName.ToLower()); sb.AppendLine(""); sb.AppendLine("{"); sb.AppendLine(string.Format("\t{0} orig = this.GetOriginal<{0}>();", dbSetInfo.GetEntityType().Name)); sb.AppendLine(string.Format("\tthis.DB.{0}.Attach({1});", tableName, dbSetInfo.dbSetName.ToLower())); sb.AppendLine(string.Format("\tthis.DB.Entry({0}).OriginalValues.SetValues(orig);", dbSetInfo.dbSetName.ToLower())); sb.AppendLine("}"); sb.AppendLine(""); sb.AppendLine("[Delete]"); sb.AppendFormat("public void Delete{1}({0} {2})", dbSetInfo.GetEntityType().Name, dbSetInfo.dbSetName, dbSetInfo.dbSetName.ToLower()); sb.AppendLine(""); sb.AppendLine("{"); sb.AppendLine(string.Format("\tthis.DB.{0}.Attach({1});", tableName, dbSetInfo.dbSetName.ToLower())); sb.AppendLine(string.Format("\tthis.DB.{0}.Remove({1});", tableName, dbSetInfo.dbSetName.ToLower())); sb.AppendLine("}"); sb.AppendLine(""); sb.AppendLine("#endregion"); return(sb.ToString()); }
public void Prepare() { Dictionary <string, RowInfo> rowsMap = GetRowsMap(); foreach (TrackAssoc trackAssoc in ChangeSet.trackAssocs) { Association assoc = _metadata.Associations[trackAssoc.assocName]; string pkey = string.Format("{0}:{1}", assoc.parentDbSetName, trackAssoc.parentKey); string ckey = string.Format("{0}:{1}", assoc.childDbSetName, trackAssoc.childKey); RowInfo parent = rowsMap[pkey]; RowInfo child = rowsMap[ckey]; ParentChildNode childNode = new ParentChildNode(child) { Association = assoc, ParentRow = parent }; updateNodes.AddLast(childNode); } foreach (DbSet dbSet in GetSortedDbSets()) { foreach (RowInfo rowInfo in dbSet.rows) { DbSetInfo dbSetInfo = rowInfo.GetDbSetInfo(); _allList.AddLast(rowInfo); switch (rowInfo.changeType) { case ChangeType.Added: _insertList.AddLast(rowInfo); break; case ChangeType.Updated: _updateList.AddLast(rowInfo); break; case ChangeType.Deleted: _deleteList.AddFirst(rowInfo); break; default: throw new DomainServiceException(string.Format(ErrorStrings.ERR_REC_CHANGETYPE_INVALID, dbSetInfo.GetEntityType().Name, rowInfo.changeType)); } } } }
public async Task Invoke(RefreshContext <TService> ctx) { DbSetInfo dbSetInfo = ctx.Request.GetDbSetInfo() ?? throw new InvalidOperationException($"Could not get the DbSet for {ctx.Request.dbSetName}"); Security.IAuthorizer <TService> authorizer = ctx.ServiceContainer.GetAuthorizer(); RunTimeMetadata metadata = ctx.Service.GetMetadata(); MethodInfoData methodData = metadata.GetOperationMethodInfo(ctx.Request.dbSetName, MethodType.Refresh); if (methodData == null) { throw new InvalidOperationException(string.Format(ErrorStrings.ERR_REC_REFRESH_INVALID, dbSetInfo.GetEntityType().Name, GetType().Name)); } await authorizer.CheckUserRightsToExecute(methodData); await _next(ctx); }
private Dictionary <string, RowInfo> GetRowsMap() { Dictionary <string, RowInfo> result = new Dictionary <string, RowInfo>(); foreach (DbSet dbSet in ChangeSet.dbSets) { DbSetInfo dbSetInfo = _metadata.DbSets[dbSet.dbSetName]; if (dbSetInfo.GetEntityType() == null) { throw new DomainServiceException(string.Format(ErrorStrings.ERR_DB_ENTITYTYPE_INVALID, dbSetInfo.dbSetName)); } foreach (RowInfo rowInfo in dbSet.rows) { rowInfo.SetDbSetInfo(dbSetInfo); result.Add(GetKey(rowInfo), rowInfo); } } return(result); }
protected virtual void TrackChangesToEntity(RowInfo rowInfo) { DbSetInfo dbSetInfo = rowInfo.GetDbSetInfo(); if (!dbSetInfo.GetIsTrackChanges()) { return; } try { string[] changed = new string[0]; switch (rowInfo.changeType) { case ChangeType.Updated: { changed = rowInfo.GetChangeState().ChangedFieldNames; } break; default: { changed = dbSetInfo.GetNames().Select(f => f.n).ToArray(); } break; } string[] pknames = dbSetInfo.GetPKFields().Select(f => f.fieldName).ToArray(); string diffgram = DiffGram.GetDiffGram(rowInfo.GetChangeState().OriginalEntity, rowInfo.changeType == ChangeType.Deleted ? null : rowInfo.GetChangeState().Entity, dbSetInfo.GetEntityType(), changed, pknames, rowInfo.changeType, dbSetInfo.dbSetName); OnTrackChange(dbSetInfo.dbSetName, rowInfo.changeType, diffgram); } catch (Exception ex) { _OnError(ex); } }
private static string CreateDbSetMethods(DbSetInfo dbSetInfo, string tableName) { StringBuilder sb = new StringBuilder(512); sb.AppendLine(string.Format("#region {0}", dbSetInfo.dbSetName)); sb.AppendLine("[Query]"); sb.AppendLine($"public async Task<QueryResult<{dbSetInfo.GetEntityType().Name}>> Read{dbSetInfo.dbSetName}()"); sb.AppendLine("{"); sb.AppendLine($"\tvar queryRes = await this.PerformQuery(this.DB.{tableName}, (countQuery) => countQuery.CountAsync());"); sb.AppendLine("\tint? totalCount = await queryRes.Count;"); sb.AppendLine("\tvar resList = await queryRes.Data.ToListAsync();"); sb.AppendLine($"\treturn new QueryResult<{dbSetInfo.GetEntityType().Name}>(resList, totalCount);"); sb.AppendLine("}"); sb.AppendLine(""); sb.AppendLine("[Insert]"); sb.AppendLine($"public void Insert{dbSetInfo.dbSetName}({dbSetInfo.GetEntityType().Name} {dbSetInfo.dbSetName.ToLower()})"); sb.AppendLine("{"); sb.AppendLine($"\tthis.DB.{tableName}.Add({dbSetInfo.dbSetName.ToLower()});"); sb.AppendLine("}"); sb.AppendLine(""); sb.AppendLine("[Update]"); sb.AppendFormat("public void Update{1}({0} {2})", dbSetInfo.GetEntityType().Name, dbSetInfo.dbSetName, dbSetInfo.dbSetName.ToLower()); sb.AppendLine(""); sb.AppendLine("{"); sb.AppendLine(string.Format("\t{0} orig = this.GetOriginal<{0}>();", dbSetInfo.GetEntityType().Name)); sb.AppendLine(string.Format("\tvar entry = this.DB.{0}.Attach({1});", tableName, dbSetInfo.dbSetName.ToLower())); sb.AppendLine("\tentry.OriginalValues.SetValues(orig);"); sb.AppendLine("}"); sb.AppendLine(""); sb.AppendLine("[Delete]"); sb.AppendFormat("public void Delete{1}({0} {2})", dbSetInfo.GetEntityType().Name, dbSetInfo.dbSetName, dbSetInfo.dbSetName.ToLower()); sb.AppendLine(""); sb.AppendLine("{"); sb.AppendLine(string.Format("\tthis.DB.{0}.Attach({1});", tableName, dbSetInfo.dbSetName.ToLower())); sb.AppendLine(string.Format("\tthis.DB.{0}.Remove({1});", tableName, dbSetInfo.dbSetName.ToLower())); sb.AppendLine("}"); sb.AppendLine(""); sb.AppendLine("#endregion"); return(sb.ToString()); }
public void UpdateEntityFromRowInfo(object entity, RowInfo rowInfo, bool isOriginal) { DbSetInfo dbSetInfo = rowInfo.GetDbSetInfo(); ValuesList values = rowInfo.values; ApplyValues(entity, rowInfo, "", values.ToArray(), isOriginal); if (!isOriginal && rowInfo.changeType == ChangeType.Added) { foreach (ParentChildNode pn in rowInfo.GetChangeState().ParentRows) { if (!_dataHelper.SetValue(entity, pn.Association.childToParentName, pn.ParentRow.GetChangeState().Entity, false)) { throw new DomainServiceException(string.Format(ErrorStrings.ERR_CAN_NOT_SET_PARENT_FIELD, pn.Association.childToParentName, dbSetInfo.GetEntityType().Name)); } } } }