Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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());
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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));
            }
        }
Exemplo n.º 6
0
        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());
        }
Exemplo n.º 7
0
        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));
                    }
                }
            }
        }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
        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);
            }
        }
Exemplo n.º 11
0
        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());
        }
Exemplo n.º 12
0
        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));
                    }
                }
            }
        }