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); }
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()); }