Ejemplo n.º 1
0
        /// <summary>
        /// 构造数据上下文
        /// </summary>
        /// <typeparam name="T">数据类型</typeparam>
        /// <param name="model">领域模型</param>
        /// <param name="opType">数据访问类型</param>
        /// <param name="data">数据</param>
        /// <returns>数据上下文</returns>
        public static DataContext CreateDataContext <T>(DomainModel.Spi.DomainModel model, DomainModel.Spi.DomainObject domainObject, DataAccessOpType opType, T data)
        {
            DataContext dataContext = null;

            switch (opType)
            {
            case DataAccessOpType.I:
                dataContext = CreateSaveContext(model, domainObject, data);
                break;

            case DataAccessOpType.Q:
                dataContext = CreateQueryContext(model, domainObject, data as IDictionary <string, object>);
                break;

            case DataAccessOpType.U:
                dataContext = CreateUpdateContext(model, domainObject, data);
                break;

            case DataAccessOpType.D:
                dataContext = CreateDeleteContext(model, domainObject, data as IDictionary <string, object>);
                break;

            default:
                break;
            }

            return(dataContext);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 批量删除
        /// </summary>
        /// <remarks>按主键数据作为查询依据</remarks>
        /// <param name="domainModel">领域模型</param>
        /// <param name="domainObject">领域对象</param>
        /// <param name="dataID">主键数据</param>
        /// <param name="shardingKeyValue">分库分表键值对</param>
        /// <returns>删除SQL</returns>
        public void DeleteByIDs(DomainModel.Spi.DomainModel domainModel, DomainModel.Spi.DomainObject domainObject, IEnumerable <string> dataIDs, ShardingValue shardingKeyValue = null)
        {
            if (domainModel == null)
            {
                throw new ArgumentNullException("DataDeleteService.DeleteByID.domainModel");
            }
            if (domainObject == null)
            {
                throw new ArgumentNullException("DataDeleteService.DeleteByID.domainObject");
            }
            if (dataIDs == null || dataIDs.Count() == 0)
            {
                throw new ArgumentNullException("DataDeleteService.DeleteByID.dataIDs");
            }

            var sqlList = new SqlStatementCollection();

            foreach (var dataID in dataIDs)
            {
                var sqls = SQLBuilderFactory.CreateSQLBuilder().ParseDeleteSqlByID(domainModel, domainObject, dataID, shardingKeyValue);
                sqlList.AddRange(sqls);
            }

            var db = DatabaseFactory.CreateDefaultDatabase();

            db.ExecuteSQLWithTransaction(sqlList);
        }
Ejemplo n.º 3
0
 /// <summary>
 /// 构造函数(Default\Insert\Delete场景)
 /// </summary>
 /// <param name="domainModel">领域模型</param>
 /// <param name="domainObject">领域对象</param>
 /// <param name="dbType">数据库类型</param>
 public SqlBuildingContext(DomainModel.Spi.DomainModel domainModel, DomainObject domainObject, DbType dbType)
 {
     this.DbType       = dbType;
     this.Node         = domainObject;
     this.DataObject   = domainObject.DataObject;
     this.CommonObject = domainModel;
 }
Ejemplo n.º 4
0
 /// <summary>
 /// 构造函数(Default\Insert\Delete场景)
 /// </summary>
 /// <param name="domainModel">通用中领域模型间对象</param>
 /// <param name="domainObject">领域对象</param>
 /// <param name="dbType">数据库类型</param>
 /// <param name="dataContext">数据上下文</param>
 public SqlBuildingContext(DomainModel.Spi.DomainModel domainModel, DomainObject domainObject, DbType dbType, DataContext dataContext)
     : this(domainModel, domainObject, dbType)
 {
     this.DataContext = dataContext;
     this.QueryFilter = dataContext.QueryFilter;
     this.DbType      = domainObject.DataObject.DataSource.DbType;
 }
Ejemplo n.º 5
0
        /// <summary>
        /// 解析生成删除SQL
        /// </summary>
        /// <remarks>按主键数据作为查询依据</remarks>
        /// <param name="domainModel">领域模型</param> 
        /// <param name="domainObject">领域对象</param>
        /// <param name="dataID">主键数据</param>
        /// <param name="shardingKeyValue">分库分表键值对</param>
        /// <returns>删除SQL</returns>
        public SqlStatementCollection ParseDeleteSqlByID(DomainModel.Spi.DomainModel domainModel, DomainModel.Spi.DomainObject domainObject, string dataID, ShardingValue shardingKeyValue = null)
        {
            var sqls = new SqlStatementCollection();
            var sqlSchema = new SqlStatementCollection();

            var routeInfo = routeService.RouteByDataID(domainModel, dataID, shardingKeyValue);
            var dataIDDic = CreatePkDataDictionary(domainModel, domainModel.RootDomainObject, dataID);
            var dataContext = DataContextBuilder.CreateDataContext<IDictionary<string, object>>(domainModel, domainObject, DataAccessOpType.D, dataIDDic);

            //解析SQL语句主干接口
            ParseDeleteSqlSchema(sqlSchema, domainModel, domainObject, routeInfo, dataContext);

            //在SqlSchema上逐表添加数据
            ParseDeleteSqlDetail(sqlSchema, sqls, domainModel, domainObject, dataContext, routeInfo);

            var result = new SqlStatementCollection();
            foreach (var tempDomainObject in domainModel.ReverseDomainObjects)
            {
                var sql = sqls.FirstOrDefault(i => i.NodeID == tempDomainObject.ID);
                if (sql != null)
                {
                    result.Add(sql);
                }
            }

            return result;
        }
Ejemplo n.º 6
0
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="domainModel">领域模型</param>
 /// <param name="domainObject">领域对象</param>
 /// <param name="dbType">数据库类型</param>
 /// <param name="filterCondition">过滤条件</param>
 /// <param name="orderByCondition">排序条件</param>
 public SqlBuildingContext(DomainModel.Spi.DomainModel domainModel, DomainObject domainObject, DbType dbType, string filterCondition = "", string orderByCondition = "")
     : this(domainModel, domainObject, dbType)
 {
     FilterCondition  = filterCondition;
     OrderByCondition = orderByCondition;
     this.DbType      = domainObject.DataObject.DataSource.DbType;
 }
Ejemplo n.º 7
0
        private static void BuildDomainObjects(System.Type t, DomainModel.Spi.DomainModel domainModel,
                                               DomainObjectAttribute rootDomainObjectAttr, DbTableAttribute rootDbTableAttr)
        {
            var rootDomainObject = new DomainObject
            {
                ID               = Guid.NewGuid().ToString(),
                Name             = rootDomainObjectAttr.Name,
                ClazzReflectType = t.FullName,
                DomainModel      = domainModel,
                IsLazyLoad       = rootDomainObjectAttr.IsLazyload,
            };

            var dataObject = new Sharding.Database.DataObject()
            {
                Name   = rootDbTableAttr.Name,
                IsView = rootDbTableAttr.IsView,
                ID     = Guid.NewGuid().ToString(),
                TableShardingStrategyID    = rootDbTableAttr.TableShardingStrategyID,
                DatabaseShardingStrategyID = rootDbTableAttr.DBShardingStrategyID,
                LogicTableName             = rootDbTableAttr.Name,
                DataSourceName             = rootDbTableAttr.DataSourceName
            };

            if (string.IsNullOrEmpty(rootDbTableAttr.ID) != false)
            {
                dataObject = new Sharding.Database.DataObject()
                {
                    ID = rootDbTableAttr.ID
                };
            }

            rootDomainObject.DataObject = dataObject;

            domainModel.RootDomainObject = rootDomainObject;
        }
Ejemplo n.º 8
0
        /// <summary>
        /// 保存领域模型数据
        /// </summary>
        /// <param name="domainModel">领域模型</param>
        /// <param name="instanceList">对象实例集合</param>
        /// <param name="shardingValueList">分区分表键值对集合</param>
        public void SaveBatch(DomainModel.Spi.DomainModel domainModel, List <object> instanceList, List <ShardingValue> shardingValueList = null)
        {
            if (domainModel == null)
            {
                throw new ArgumentNullException("SaveService.Save.domainModel");
            }
            if (instanceList == null)
            {
                throw new ArgumentNullException("SaveService.Save.instanceList");
            }

            var sqls = new SqlStatementCollection();

            for (int i = 0; i < instanceList.Count; i++)
            {
                var           currentObj    = instanceList[i];
                ShardingValue shardingValue = null;
                if (shardingValueList != null)
                {
                    shardingValue = shardingValueList[i];
                }

                var sqlstatements = SQLBuilderFactory.CreateSQLBuilder().ParseInsertSql(domainModel, currentObj, shardingValue);

                sqls.AddRange(sqlstatements);
            }

            var db = DatabaseFactory.CreateDefaultDatabase();

            db.ExecuteSQLWithTransaction(sqls);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// 构造ShardingValue
        /// </summary>
        /// <param name="domainModel">领域模型</param>
        /// <param name="instance">数据</param>
        /// <returns>ShardingValue</returns>
        private ShardingValue CreateShardingValue(DomainModel.Spi.DomainModel domainModel, DomainModel.Spi.DomainObject domainObject, object instance)
        {
            ShardingValue shardingValue  = null;
            var           shardingColumn = domainObject.DataObject.Columns.FirstOrDefault(i => i.IsShardingColumn);

            if (shardingColumn == null)
            {
                throw new Exception("DataObject unset sharding column:" + domainObject.DataObjectID);
            }

            var shardingElement = domainObject.Elements.FirstOrDefault(i => i.DataColumnID == shardingColumn.ID);

            var propValue = ObjectPropertyValueUtils.GetPropValue(shardingElement.PropertyName, instance);

            switch (shardingElement.DataType)
            {
            case ElementDataType.DateTime:
            case ElementDataType.Date:
                shardingValue = new ShardingValue(domainModel.Name, shardingElement.ID, Convert.ToDateTime(propValue));
                break;

            case ElementDataType.Integer:
                shardingValue = new ShardingValue(domainModel.Name, shardingElement.ID, Convert.ToInt64(propValue));
                break;

            case ElementDataType.String:
            default:
                shardingValue = new ShardingValue(domainModel.Name, shardingElement.ID, Convert.ToString(propValue));
                break;
            }

            return(shardingValue);
        }
Ejemplo n.º 10
0
        /// <summary>
        /// 构造ShardingValue
        /// </summary>
        /// <param name="domainModel">领域模型</param>
        /// <param name="instance">数据</param>
        /// <returns>ShardingValue</returns>
        private ShardingValue CreateShardingValueByDataID(DomainModel.Spi.DomainModel domainModel, DomainObject domainObject, string dataID)
        {
            ShardingValue shardingValue  = null;
            var           shardingColumn = domainObject.DataObject.Columns.FirstOrDefault(i => i.IsShardingColumn);

            if (shardingColumn == null)
            {
                return(shardingValue);
            }

            var shardingElement = domainObject.Elements.FirstOrDefault(i => i.DataColumnID == shardingColumn.ID);

            switch (shardingElement.DataType)
            {
            case ElementDataType.DateTime:
            case ElementDataType.Date:
                shardingValue = new ShardingValue(domainModel.Name, shardingElement.ID, Convert.ToDateTime(dataID));
                break;

            case ElementDataType.Integer:
                shardingValue = new ShardingValue(domainModel.Name, shardingElement.ID, Convert.ToInt64(dataID));
                break;

            case ElementDataType.String:
            default:
                shardingValue = new ShardingValue(domainModel.Name, shardingElement.ID, Convert.ToString(dataID));
                break;
            }

            return(shardingValue);
        }
Ejemplo n.º 11
0
        /// <summary>
        /// 初始化SQL构造中间变量
        /// </summary>
        /// <param name="commonObject">通用中间对象</param>
        /// <param name="coNode">节点</param>
        /// <param name="dataObject">数据对象</param>
        /// <param name="currentDbTable">当前操作对应的数据库表</param>
        /// <returns>SQL构造中间变量</returns>
        protected SqlBuildingInfo InitSqlBuildingInfo(DomainModel.Spi.DomainModel commonObject, DomainObject coNode, DataObject dataObject, string tableName, string dataSourceName)
        {
            //构造SqlBuildingInfo
            var sqlInfo = new SqlBuildingInfo();

            sqlInfo.CommonObject      = commonObject;
            sqlInfo.RootNode          = commonObject.RootDomainObject;
            sqlInfo.CurrentNode       = coNode;
            sqlInfo.CurrentDataObject = dataObject;
            sqlInfo.TableName         = tableName;
            sqlInfo.DataSource        = dataSourceName;
            sqlInfo.CurrentSqlTable   = new SqlTable(sqlInfo.TableName, sqlInfo.TableName, sqlInfo.TableName);

            //SqlTable注册处理
            RegistSqlTable(sqlInfo.CurrentSqlTable.TableName, sqlInfo.CurrentSqlTable, sqlInfo);

            //如果当前节点是根节点:
            if (sqlInfo.RootNode.ID == sqlInfo.CurrentNode.ID)
            {
                sqlInfo.RootDataObject = dataObject;
                sqlInfo.RootSqlTable   = sqlInfo.CurrentSqlTable;
            }
            else
            {
                sqlInfo.RootDataObject = commonObject.RootDomainObject.DataObject;

                //sqlInfo.RootSqlTable = GetSubQuerySql(commonObject, commonObject.RootNode);
            }

            //SqlTable再次注册处理
            RegistSqlTable(sqlInfo.CurrentSqlTable.TableName, sqlInfo.CurrentSqlTable, sqlInfo);

            return(sqlInfo);
        }
Ejemplo n.º 12
0
        /// <summary>
        /// 初始化SQL构造中间变量
        /// </summary>
        /// <param name="commonObject">通用中间对象</param>
        /// <param name="coNode">节点</param>
        /// <param name="dataObject">数据对象</param>
        /// <param name="currentDbTable">当前操作对应的数据库表</param>
        /// <returns>SQL构造中间变量</returns>
        protected SqlBuildingInfo InitSqlBuildingInfoForSelect(DomainModel.Spi.DomainModel commonObject, DomainObject coNode, DataObject dataObject, string tableName)
        {
            var sqlInfo = new SqlBuildingInfo()
            {
                CommonObject      = commonObject,
                RootNode          = commonObject.RootDomainObject,
                CurrentNode       = coNode,
                CurrentDataObject = dataObject,
                TableName         = tableName
            };

            sqlInfo.CurrentSqlTable = new SqlTable(sqlInfo.TableName, sqlInfo.TableName, sqlInfo.TableName);

            //如果当前节点是根节点:
            if (sqlInfo.CurrentNode.IsRootObject || sqlInfo.RootNode.ID == sqlInfo.CurrentNode.ID)
            {
                sqlInfo.RootDataObject = dataObject;
                sqlInfo.RootSqlTable   = sqlInfo.CurrentSqlTable;
            }
            else
            {
                sqlInfo.RootDataObject = commonObject.RootDomainObject.DataObject;
                //sqlInfo.RootSqlTable = CoHelper.GetRootSQLDomTable(commonObject);
            }

            RegistSqlTable(sqlInfo.CurrentDataObject.ID, sqlInfo.CurrentSqlTable, sqlInfo);

            return(sqlInfo);
        }
Ejemplo n.º 13
0
        /// <summary>
        /// 数据领域对象
        /// </summary>
        /// <param name="dataObject">领域对象</param>
        public void SaveDomainModel(DomainModel.Spi.DomainModel domainModel)
        {
            if (domainModel == null)
            {
                throw new ArgumentNullException("DomainModelManager.SaveDomainModel.domainModel");
            }

            var asso      = domainModel.DomainObjects.SelectMany(i => i.Associations).ToList();
            var assoItems = asso.SelectMany(i => i.Items).ToList();

            using (var tran = new TransactionScope(TransactionScopeOption.Required))
            {
                DacServiceManager.GetDomainModelDao().SaveDomainModel(domainModel);
                foreach (var domainObject in domainModel.DomainObjects)
                {
                    DacServiceManager.GetDomainModelDao().SaveDomainObjectElements(domainObject.Elements);
                }
                if (asso.Count > 0)
                {
                    DacServiceManager.GetDomainModelDao().SaveDomainAssociation(asso);
                }
                if (assoItems.Count > 0)
                {
                    DacServiceManager.GetDomainModelDao().SaveDomainAssociationItem(assoItems);
                }

                tran.Complete();
            }
        }
Ejemplo n.º 14
0
        /// <summary>
        /// 构造查询主体部分
        /// </summary>
        /// <remarks>查询主体是一个子查询,为了支持一个数据对象多个数据库表</remarks>
        /// <param name="sql">Select语句</param>
        /// <param name="domainModel">通用中间对象</param>
        /// <param name="domainObject">当前节点</param>
        /// <param name="dataObject">当前节点对应的数据对象</param>
        private void BuildMainFrom(SelectSqlStatement sql, DomainModel.Spi.DomainModel domainModel, DomainObject domainObject, DataObject dataObject, string tableName, SqlBuildingContext sqlContext)
        {
            //初始化主查询SQL语句

            var context = sqlContext.DataContext;
            sql.NodeID = domainObject.ID;
            sql.CommonObjectID = domainModel.ID;
            sql.NodeVersion = domainModel.Version.ToString();
            sql.CommonObjectVersion = domainModel.Version.ToString();
            sql.TableName = tableName;
            sql.TableCode = tableName;
            sql.SqlBuildingInfo = base.InitSqlBuildingInfo(domainModel, domainObject, dataObject, tableName, sqlContext.DataSource);

            if (context.Data.ContainsKey(domainObject.ID))
            {
                var dataContextItem = context.GetCurrentDataContextItem(domainObject.ID);
                foreach (var column in dataObject.PKColumns)
                {
                    var pkField = new SqlPrimaryKeyField(sql.SqlBuildingInfo.CurrentSqlTable, column.ColumnName);
                    var pkElement = domainObject.Elements.FirstOrDefault(i => i.DataColumnID == column.ID);
                    pkField.Value.Value = dataContextItem.PrimaryKeyData[pkElement.ID];
                    sql.PrimaryKeys.ChildCollection.Add(pkField);
                }
            }

            //将子查询加入到当前Select语句中
            sql.From.ChildCollection.Add(sql.SqlBuildingInfo.CurrentSqlTable);
        }
Ejemplo n.º 15
0
        protected static DataContext CreateUpdateContext(DomainModel.Spi.DomainModel model, DomainModel.Spi.DomainObject domainObject, object data)
        {
            var context = new DataContext();

            var dataContextItem = GetModelObjectPropValue(data, domainObject, DataAccessOpType.U, true);

            context.Add(domainObject.ID, new List <DataContextItem>()
            {
                dataContextItem
            });

            if (domainObject.ChildDomainObjects.Count > 0)
            {
                foreach (var childModelObject in domainObject.ChildDomainObjects)
                {
                    var objectList = ObjectPropertyValueUtils.GetCollectionPropValue(childModelObject.PropertyName, data);
                    var items      = new List <DataContextItem>(objectList.Count());
                    foreach (var obj in objectList)
                    {
                        items.Add(GetModelObjectPropValue(obj, childModelObject, DataAccessOpType.U, true));
                        LoopGetModelObjectPropValue(childModelObject, context, obj, DataAccessOpType.U, true);
                    }

                    context.Add(childModelObject.ID, items);
                }
            }

            return(context);
        }
Ejemplo n.º 16
0
        /// <summary>
        /// 获取领域模型结果集映射
        /// </summary>
        /// <param name="model">领域模型</param>
        /// <returns>领域模型结果集映射</returns>
        public ResultMapping GetResultMapping(DomainModel.Spi.DomainModel model)
        {
            if (model == null)
            {
                throw new ArgumentNullException("ResultMappingService.GetResultMapping.model");
            }

            return(ResultMappingFactory.GetInstance().CreateOrGetResultMapping(model));
        }
Ejemplo n.º 17
0
 private Dictionary<string, object> CreatePkDataDictionary(DomainModel.Spi.DomainModel domainModel, DomainModel.Spi.DomainObject domainObject, string dataID)
 {
     var dataIDDic = new Dictionary<string, object>();
     foreach (var column in domainObject.DataObject.PKColumns)
     {
         var pkElement = domainObject.Elements.FirstOrDefault(i => i.DataColumnID == column.ID);
         dataIDDic.Add(pkElement.ID, dataID);
         break;
     }
     return dataIDDic;
 }
Ejemplo n.º 18
0
        /// <summary>
        /// 删除领域对象
        /// </summary>
        /// <param name="id">领域对象ID</param>
        public void DeleteDomainModel(string id)
        {
            var model = new DomainModel.Spi.DomainModel {
                ID = id
            };

            this.DomainModels.Attach(model);
            this.DomainModels.Remove(model);

            this.SaveChanges();
        }
Ejemplo n.º 19
0
        /// <summary>
        /// 解析生成Insert语句。
        /// </summary>       
        /// <param name="domainModel">领域模型。</param>
        /// <param name="instance">要插入的数据。</param>
        /// <param name="shardingKeyValue">分库分表键值对</param>
        /// <returns>Insert语句集合。</returns>
        public SqlStatementCollection ParseInsertSql(DomainModel.Spi.DomainModel domainModel, object instance, ShardingValue shardingKeyValue = null)
        {
            var sqls = new SqlStatementCollection();
            var routeInfo = routeService.Route(domainModel, instance, shardingKeyValue);
            var dataContext = DataContextBuilder.CreateDataContext<object>(domainModel, domainModel.RootDomainObject, DataAccessOpType.I, instance);

            //解析SQL语句主干接口
            ParseInsertSqlSchema(sqls, domainModel, domainModel.RootDomainObject, routeInfo);

            //在SqlSchema上逐表添加数据
            return ParseInsertSqlDetail(sqls, domainModel, dataContext, routeInfo);
        }
Ejemplo n.º 20
0
        public static DomainModel.Spi.DomainModel Parse(System.Type t)
        {
            var domainModel = new DomainModel.Spi.DomainModel();

            var attributes = t.GetCustomAttributes(false);

            var domainModelAttrObj = attributes.FirstOrDefault(i => i.GetType() == typeof(DomainModelAttribute));

            if (domainModelAttrObj == null)
            {
                throw new Exception($"Type:{t.FullName} does not contain DomainModelAttribute");
            }

            var domainModelAttr = domainModelAttrObj as DomainModelAttribute;

            domainModel.Name = domainModelAttr.Name;
            domainModel.ID   = Guid.NewGuid().ToString();

            var domainModelCacheAttrObj = attributes.FirstOrDefault(i => i.GetType() == typeof(CacheAttribute));

            if (domainModelCacheAttrObj != null)
            {
                var domainModelCacheAttr = domainModelCacheAttrObj as CacheAttribute;
                domainModel.IsCache       = true;
                domainModel.CacheStrategy = domainModelCacheAttr.Scope.ToString();
            }

            var domainModelLogicDelAttrObj = attributes.FirstOrDefault(i => i.GetType() == typeof(LogicDeleteAttribute));

            if (domainModelLogicDelAttrObj != null)
            {
                domainModel.IsLogicDelete = true;
            }

            //解析子对象
            var rootDomainObjectAttr = attributes.FirstOrDefault(i => i.GetType() == typeof(DomainObjectAttribute)) as DomainObjectAttribute;

            if (rootDomainObjectAttr == null)
            {
                throw new Exception($"Type:{t.FullName} does not contain DomainObjectAttribute");
            }

            var rootDbTableAttr = attributes.FirstOrDefault(i => i.GetType() == typeof(DbTableAttribute)) as DbTableAttribute;

            if (rootDbTableAttr == null)
            {
                throw new Exception($"Type:{t.FullName} does not contain DbTableAttribute");
            }

            BuildDomainObjects(t, domainModel, rootDomainObjectAttr, rootDbTableAttr);

            return(domainModel);
        }
Ejemplo n.º 21
0
        /// <summary>
        /// 领域对象校验
        /// </summary>
        /// <param name="model">领域对象</param>
        private void DomainModelValidate(DomainModel.Spi.DomainModel model)
        {
            foreach (var domainObject in model.DomainObjects)
            {
                if (string.IsNullOrWhiteSpace(domainObject.DataObjectID))
                {
                    throw new Exception(string.Format("DomainObject:{0}, can not find DataObject.", model.Name));
                }

                if (domainObject.DataObject == null)
                {
                    domainObject.DataObject = DataObjectManageService.GetInstance().GetDataObject(domainObject.DataObjectID);
                }
            }
        }
Ejemplo n.º 22
0
        protected static DataContext CreateDeleteContext(DomainModel.Spi.DomainModel model, DomainModel.Spi.DomainObject domainObject, IDictionary <string, object> pkData)
        {
            var context         = new DataContext();
            var dataContextItem = new DataContextItem()
            {
                OpType = DataAccessOpType.D
            };

            dataContextItem.PrimaryKeyData = pkData;
            context.Add(domainObject.ID, new List <DataContextItem>()
            {
                dataContextItem
            });

            return(context);
        }
Ejemplo n.º 23
0
        /// <summary>
        /// 获取对象数据
        /// </summary>
        /// <param name="domainModel">领域模型</param>
        /// <param name="dataID">数据唯一标识</param>
        /// <param name="shardingValue">分库分表键值对</param>
        /// <returns>对象数据</returns>
        public List <DataTable> GetData(DomainModel.Spi.DomainModel domainModel, string dataID, ShardingValue shardingValue = null)
        {
            if (domainModel == null)
            {
                throw new ArgumentNullException("DataQueryService.GetData.domainModel");
            }
            if (string.IsNullOrWhiteSpace(dataID))
            {
                throw new ArgumentNullException("DataQueryService.GetData.dataID");
            }

            var sqls = SQLBuilderFactory.CreateSQLBuilder().ParseQuerySqlByID(domainModel, dataID, shardingValue);

            var db = DatabaseFactory.CreateDefaultDatabase();

            return(db.GetDataCollection(sqls));
        }
Ejemplo n.º 24
0
        /// <summary>
        /// 更新领域模型数据
        /// </summary>
        /// <param name="domainModel">领域模型</param>
        /// <param name="instance">对象实例</param>
        /// <param name="shardingValue">分区分表键值对</param>
        public void Update(DomainModel.Spi.DomainModel domainModel, object instance, ShardingValue shardingValue = null)
        {
            if (domainModel == null)
            {
                throw new ArgumentNullException("DataUpdateService.Update.domainModel");
            }
            if (instance == null)
            {
                throw new ArgumentNullException("DataUpdateService.Update.instance");
            }

            var sqls = SQLBuilderFactory.CreateSQLBuilder().ParseUpdateSql(domainModel, instance, shardingValue);

            var db = DatabaseFactory.CreateDefaultDatabase();

            db.ExecuteSQLWithTransaction(sqls);
        }
Ejemplo n.º 25
0
        public static ISQLBuilder CreateSQLBuilder(DomainModel.Spi.DomainModel domainModel)
        {
            var mainDbType = domainModel.RootDomainObject.DataObject.DataSource.DbType;

            switch (mainDbType)
            {
            //case DbType.ES:
            //    return new ESSQLBuilder();
            case DbType.SQLServer:
            case DbType.MySQL:
            case DbType.Oracle:
                return(CreateSQLBuilder());

            default:
                return(CreateSQLBuilder());
            }
        }
Ejemplo n.º 26
0
        public static IDatabase CreateDatabase(DomainModel.Spi.DomainModel domainModel)
        {
            var mainDbType = domainModel.RootDomainObject.DataObject.DataSource.DbType;

            switch (mainDbType)
            {
            //case Metadata.Database.DbType.ES:
            //    return new ESDatabase();
            case DbType.SQLServer:
            case DbType.MySQL:
            case DbType.Oracle:
                return(CreateDefaultDatabase());

            default:
                return(CreateDefaultDatabase());
            }
        }
Ejemplo n.º 27
0
        /// <summary>
        /// 解析生成删除SQL
        /// </summary>
        /// <remarks>按主键数据作为查询依据</remarks>
        /// <param name="domainModel">领域模型</param>
        /// <param name="dataID">主键数据</param>
        /// <param name="shardingKeyValue">分库分表键值对</param>
        /// <returns>删除SQL</returns>
        public void DeleteByID(DomainModel.Spi.DomainModel domainModel, string dataID, ShardingValue shardingKeyValue = null)
        {
            if (domainModel == null)
            {
                throw new ArgumentNullException("DataDeleteService.DeleteByID.domainModel");
            }
            if (string.IsNullOrWhiteSpace(dataID))
            {
                throw new ArgumentNullException("DataDeleteService.DeleteByID.dataID");
            }

            var sqls = SQLBuilderFactory.CreateSQLBuilder().ParseDeleteSqlByID(domainModel, dataID, shardingKeyValue);

            var db = DatabaseFactory.CreateDefaultDatabase();

            db.ExecuteSQLWithTransaction(sqls);
        }
Ejemplo n.º 28
0
        /// <summary>
        /// 解析生成查询SQL
        /// </summary>
        /// <remarks>按主键数据作为查询依据</remarks>
        /// <param name="domainModel">领域模型</param>            
        /// <param name="domainObject">领域对象</param>        
        /// <param name="dataID">主键数据</param>
        /// <param name="shardingKeyValue">分库分表键值对</param>
        /// <returns>查询SQL</returns>
        public SqlStatementCollection ParseQuerySqlByID(DomainModel.Spi.DomainModel domainModel, DomainModel.Spi.DomainObject domainObject, string dataID, ShardingValue shardingKeyValue = null)
        {
            var sqls = new SqlStatementCollection();
            var sqlSchema = new SqlStatementCollection();

            var routeInfo = routeService.RouteByDataID(domainModel, dataID, shardingKeyValue);
            var dataIDDic = CreatePkDataDictionary(domainModel, domainObject, dataID);
            var dataContext = DataContextBuilder.CreateDataContext<IDictionary<string, object>>(domainModel, domainObject, DataAccessOpType.Q, dataIDDic);

            //解析SQL语句主干接口
            ParseQuerySqlSchema(sqlSchema, domainModel, domainObject, routeInfo, dataContext);

            //在SqlSchema上逐表添加数据
            ParseQuerySqlDetail(sqlSchema, sqls, domainModel, domainObject, dataContext, routeInfo);

            return sqlSchema;
        }
Ejemplo n.º 29
0
        /// <summary>
        /// 构造查询SQL语句的主干结构
        /// </summary>
        /// <param name="dataObject">数据对象</param>
        /// <returns>查询SQL语句的主干结构</returns>
        private void ParseDeleteSqlSchema(SqlStatementCollection sqlSchemata, DomainModel.Spi.DomainModel domainModel, DomainModel.Spi.DomainObject domainObject, Dictionary<string, ShardingTarget> routeInfo, DataContext dataContext)
        {
            var selectStrategy = new DeleteSqlBuildStrategy();
            var context = new SqlBuildingContext(domainModel, domainObject, SQLBuilderUtils.GetCurrentDbType(), dataContext);
            context.RouteInfo = routeInfo;

            var nodeSqlSchemata = selectStrategy.BuildTableSqlSchema(context);
            sqlSchemata.AddRange(nodeSqlSchemata);

            //递归处理子对象
            if (domainObject.ChildDomainObjects.Count == 0) return;

            foreach (var childModelObject in domainObject.ChildDomainObjects)
            {
                ParseDeleteSqlSchema(sqlSchemata, domainModel, childModelObject, routeInfo, dataContext);
            }
        }
Ejemplo n.º 30
0
        public static void AreEqual(DomainModel.Spi.DomainModel expected, DomainModel.Spi.DomainModel actual)
        {
            Assert.IsNotNull(expected);
            Assert.IsNotNull(actual);

            Assert.AreEqual(expected.CacheStrategy, actual.CacheStrategy);
            Assert.AreEqual(expected.IsCache, actual.IsCache);
            Assert.AreEqual(expected.Name, actual.Name);
            Assert.AreEqual(expected.RootDomainObjectID, actual.RootDomainObjectID);
            Assert.AreEqual(expected.Version, actual.Version);
            Assert.AreEqual(expected.DomainObjects.Count, actual.DomainObjects.Count);

            Assert.AreEqual(expected.RootDomainObject.DataObjectID, actual.RootDomainObject.DataObjectID);
            Assert.AreEqual(expected.RootDomainObject.DomainModelID, actual.RootDomainObject.DomainModelID);
            Assert.AreEqual(expected.RootDomainObject.IsRootObject, actual.RootDomainObject.IsRootObject);
            Assert.AreEqual(expected.RootDomainObject.PropertyName, actual.RootDomainObject.PropertyName);
            Assert.AreEqual(expected.RootDomainObject.Elements.Count, actual.RootDomainObject.Elements.Count);
        }