public override void Add <TEntity>(TEntity entity)
        {
            Guard.NotNull(entity, nameof(entity));

            ModelConventionHelper.Validate <TEntity>(entity);

            var entityType = typeof(TEntity);
            var keyValues  = Conventions.GetPrimaryKeyValues(entity);

            if (_db.TryFind <TEntity>(keyValues, out object _))
            {
                throw new InvalidOperationException(
                          string.Format(
                              CultureInfo.CurrentCulture,
                              Resources.EntityAlreadyBeingTrackedInStore,
                              entityType));
            }

            if (TryGeneratePrimaryKey <TEntity>(entity, out var newKey))
            {
                // assumes we only have a single key since
                // we cannot generated for a composite key anyways
                keyValues[0] = newKey;
            }

            _db.AddOrUpdate <TEntity>(entity, keyValues);
        }
示例#2
0
        public void Apply(ActionModel action)
        {
            // 判断是否为指定接口类型的实现类
            if (!serviceType.IsAssignableFrom(action.Controller.ControllerType))
            {
                return;
            }

            var actionParams = action.ActionMethod.GetParameters();
            // 这串linq是查询出接口类型中与当前action相对应方法,从中获取特性
            var method = serviceType.GetMethods().FirstOrDefault(mth =>
            {
                var mthParams = mth.GetParameters();
                return(action.ActionMethod.Name == mth.Name &&
                       actionParams.Length == mthParams.Length &&
                       actionParams.Any(x => mthParams.Where(o => x.Name == o.Name).Any(o => x.GetType() == o.GetType())));
            });

            var attrs       = method.GetCustomAttributes(false);
            var actionAttrs = new List <object>();

            foreach (var att in attrs)
            {
                //下面的HttpMethodAttribute是我们自己写的特性类型
                if (att is HttpMethodAttribute methodAttr)
                {
                    var httpMethod = methodAttr.Method;
                    var path       = methodAttr.Path;
                    if (httpMethod == HttpMethod.Get)
                    {
                        //添加的HttpGet和HttpPost使用了命名空间别名
                        actionAttrs.Add(Activator.CreateInstance(typeof(HttpGet), path));
                    }
                    else if (httpMethod == HttpMethod.Post)
                    {
                        actionAttrs.Add(Activator.CreateInstance(typeof(HttpPost), path));
                    }
                }
                //下面的RouteAttribute是我们自己写的特性类型
                if (att is RouteAttribute routeAttr)
                {
                    actionAttrs.Add(Activator.CreateInstance(typeof(Route), routeAttr.Template));
                }
            }
            if (actionAttrs.Any())
            {
                action.Selectors.Clear();
                //AddRange静态方法就是从源码中复制过来的
                ModelConventionHelper.AddRange(action.Selectors, ModelConventionHelper.CreateSelectors(actionAttrs));
            }
        }
        /// <summary>
        /// Gets the default conventions.
        /// </summary>
        /// <typeparam name="TOwner">The type that owns this conventions.</typeparam>
        public static IRepositoryConventions Default <TOwner>() where TOwner : IRepositoryContext
        {
            var conventions = new RepositoryConventions(typeof(TOwner));

            conventions.PrimaryKeysCallback      = pi => PrimaryKeyConventionHelper.GetPrimaryKeyPropertyInfos(conventions, pi);
            conventions.ForeignKeysCallback      = (sourceType, foreignType) => ForeignKeyConventionHelper.GetForeignKeyPropertyInfos(conventions, sourceType, foreignType);
            conventions.TableNameCallback        = type => ModelConventionHelper.GetTableName(type);
            conventions.ColumnNameCallback       = pi => ModelConventionHelper.GetColumnName(pi);
            conventions.ColumnOrderCallback      = pi => ModelConventionHelper.GetColumnOrder(conventions, pi);
            conventions.IsColumnIdentityCallback = pi => ModelConventionHelper.IsColumnIdentity(conventions, pi);
            conventions.IsColumnMappedCallback   = pi => ModelConventionHelper.IsColumnMapped(pi);

            return(conventions);
        }
        public override void Remove <TEntity>(TEntity entity)
        {
            Guard.NotNull(entity, nameof(entity));

            ModelConventionHelper.Validate <TEntity>(entity);

            var keyValues = Conventions.GetPrimaryKeyValues(entity);

            if (!_db.TryFind <TEntity>(keyValues, out object _))
            {
                throw new InvalidOperationException(Resources.EntityNotFoundInStore);
            }

            _db.Remove <TEntity>(keyValues);
        }
 public string Build <T>()
 {
     return(ModelConventionHelper.GetTableName <T>().ToLower());
 }