/// <summary> /// <para>从“One-to-Many”关系的“One”实体模型中查找表示“Many”的实体模型的类型。</para> /// <para>代表“One”的实体模型类型必须实现 <see cref="IChildEntityModel"/> 接口。</para> /// </summary> /// <param name="oneType">代表“One”的实体模型类型。</param> /// <returns>返回代表“Many”实体模型的类型(已找到)或空引用(<c>null</c>,未找到)</returns> /// <exception cref="ArgumentNullException">当 <paramref name="oneType"/> 为空引用(<c>null</c>)时引发。</exception> /// <exception cref="InvalidOperationException">当 <paramref name="oneType"/> 未实现 <see cref="IChildEntityModel"/> 接口时引发。</exception> /// <exception cref="InvalidOperationException">当 <paramref name="oneType"/> 代表的类型未实现 <see cref="IChildEntityModel"/> 接口时引发。</exception> public static Type FindManyTypeFromOne(this Type oneType) { #region Paramter Check ParamCheck.NotNull(oneType, nameof(oneType)); #endregion // 如果 oneType 未实现 IChildEntityModel 接口,则 if (!oneType.IsImplFrom <IChildEntityModel>()) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Properties.Resource.TypeImplInterfaceRequire, typeof(IChildEntityModel).FullName)); } // 获取给定类型已实现的满足条件的接口类型(泛型&是 IChildEntityModel 的继承) var oneTypeInfo = oneType.GetTypeInfo(); var childIfType = oneTypeInfo.GetInterfaces() .FirstOrDefault(ifType => ifType.GetTypeInfo().IsGenericType&& ifType.IsDerivedFrom <IChildEntityModel>()); return(childIfType?.GenericTypeArguments[0]); }
/// <summary> /// 进行映射处理。 /// </summary> /// <param name="builder">指定当前上下文构建模型的生成器。</param> /// <param name="modelType">将要进行映射的实体模型类型。</param> /// <exception cref="ArgumentNullException">当 <paramref name="builder"/> 或 <paramref name="modelType"/> 为空引用(<c>null</c>)时引发。</exception> public void Mapping(ModelBuilder builder, Type modelType) { #region Parameter Check ParamCheck.NotNull(builder, nameof(builder)); ParamCheck.NotNull(modelType, nameof(modelType)); #endregion // 检查可用性。 if (!this.CanMapping(modelType)) { return; } var typeBuilder = builder.Entity(modelType); typeBuilder.Property(nameof(ICnvOfEntityModel.Code)) .IsRequired() .HasMaxLength(32) .IsUnicode(false); typeBuilder.Property(nameof(ICnvOfEntityModel.Name)) .IsRequired() .HasMaxLength(64); typeBuilder.Property(nameof(ICnvOfEntityModel.Description)).HasMaxLength(255); typeBuilder.Property(nameof(ICnvOfEntityModel.Value)).HasMaxLength(255); }
/// <summary> /// 使用指定的模型生成操作来初始化 <see cref="DbContextByMappingStrategy"/> 的新实例。 /// </summary> /// <param name="action">用于配置模型的生成操作。</param> public DbContextByMappingStrategy(Action <ModelBuilder> action) { #region Parameter's Check ParamCheck.NotNull(action, nameof(action)); #endregion this._action = action; }
public void NotNullTest(string value, Type exType, string paramName) { if (exType != null) { ArgumentException ex = (ArgumentException)Assert.Throws(exType, () => ParamCheck.NotNull(value, paramName)); Assert.Equal(String.IsNullOrEmpty(paramName) ? "name" : paramName, ex.ParamName); } else { ParamCheck.NotNull(value, paramName); } }
/// <summary> /// create this factory. all parameters are mandatory. /// </summary> /// <param name="evernoteUri">evernote base url, like http://sandbox.evernote.com/</param> /// <param name="consumerKey">your personal consumer key that you got from Evernote</param> /// <param name="consumerSecret">your secret key that you got from Evernote</param> public StoreFactory(Uri evernoteUri, string consumerKey, string consumerSecret) { ParamCheck.NotNull("evernoteUri", evernoteUri); ParamCheck.NullNorEmpty("consumerKey", consumerKey); ParamCheck.NullNorEmpty("consumerSecret", consumerSecret); this.evernoteUri = evernoteUri; this.consumerKey = consumerKey; this.consumerSecret = consumerSecret; this.servicebus = new ServiceBus(); //we are interested in auth event this.servicebus.AddSubscriber <AuthenticationEvent>(authenticationEventHandler); }
/// <summary> /// 进行映射处理。 /// </summary> /// <param name="builder">指定当前上下文构建模型的生成器。</param> /// <param name="modelType">将要进行映射的实体模型类型。</param> /// <exception cref="ArgumentNullException">当 <paramref name="builder"/> 或 <paramref name="modelType"/> 为空引用(<c>null</c>)时引发。</exception> public void Mapping(ModelBuilder builder, Type modelType) { #region Parameter Check ParamCheck.NotNull(builder, nameof(builder)); ParamCheck.NotNull(modelType, nameof(modelType)); #endregion // 检查可用性。 if (!this.CanMapping(modelType)) { return; } var typeBuilder = builder.Entity(modelType); typeBuilder.Property(nameof(IStateOfEntityModel.State)) .IsRequired(); }
/// <summary> /// 进行映射处理。 /// </summary> /// <param name="builder">指定当前上下文构建模型的生成器。</param> /// <param name="modelType">将要进行映射的实体模型类型。</param> /// <exception cref="ArgumentNullException">当 <paramref name="builder"/> 或 <paramref name="modelType"/> 为空引用(<c>null</c>)时引发。</exception> public virtual void Mapping(ModelBuilder builder, Type modelType) { #region Parameter Check ParamCheck.NotNull(builder, nameof(builder)); ParamCheck.NotNull(modelType, nameof(modelType)); #endregion // 检查可用性。 if (!this.CanMapping(modelType)) { return; } builder.Entity(modelType) .Property(nameof(IParentEntityModelOfInt32 <EntityModelOfInt32> .ParentId)) .IsRequired(); }
/// <summary> /// 进行映射处理。 /// </summary> /// <param name="builder">指定当前上下文构建模型的生成器。</param> /// <param name="modelType">将要进行映射的实体模型类型。</param> /// <exception cref="ArgumentNullException">当 <paramref name="builder"/> 或 <paramref name="modelType"/> 为空引用(<c>null</c>)时引发。</exception> public void Mapping(ModelBuilder builder, Type modelType) { #region Parameter Check ParamCheck.NotNull(builder, nameof(builder)); ParamCheck.NotNull(modelType, nameof(modelType)); #endregion // 检查可用性。 if (!this.CanMapping(modelType)) { return; } var typeBuilder = builder.Entity(modelType); typeBuilder.Property(nameof(INoteOfEntityModel.Note)).HasMaxLength(255); typeBuilder.Property(nameof(INoteOfEntityModel.SecondNote)).HasMaxLength(255); typeBuilder.Property(nameof(INoteOfEntityModel.ThirdNote)).HasMaxLength(255); }
/// <summary> /// 进行映射处理。 /// </summary> /// <param name="builder">指定当前上下文构建模型的生成器。</param> /// <param name="modelType">将要进行映射的实体模型类型。</param> /// <exception cref="ArgumentNullException">当 <paramref name="builder"/> 或 <paramref name="modelType"/> 为空引用(<c>null</c>)时引发。</exception> public virtual void Mapping(ModelBuilder builder, Type modelType) { #region Parameter Check ParamCheck.NotNull(builder, nameof(builder)); ParamCheck.NotNull(modelType, nameof(modelType)); #endregion // 检查可用性。 if (!this.CanMapping(modelType)) { return; } #region 射的目的表名称 string modelTypeName = modelType.Name; string tableName = modelTypeName.Replace("EntityModel", String.Empty) .Replace("Model", String.Empty) .Replace("Entity", String.Empty); // 如果表名称为空,则使用类型名称替代。 if (String.IsNullOrEmpty(tableName)) { tableName = modelTypeName; } #endregion // 主键 ID 的名称。 string idName = this.GetIdName(modelType); var typeBuilder = builder.Entity(modelType); typeBuilder.ToTable(tableName) .HasKey(idName) .HasName($"PK_{tableName}_{idName}"); }
/// <summary> /// 进行映射处理。 /// </summary> /// <param name="builder">指定当前上下文构建模型的生成器。</param> /// <param name="modelType">将要进行映射的实体模型类型。</param> /// <exception cref="ArgumentNullException">当 <paramref name="builder"/> 或 <paramref name="modelType"/> 为空引用(<c>null</c>)时引发。</exception> public virtual void Mapping(ModelBuilder builder, Type modelType) { #region Parameter Check ParamCheck.NotNull(builder, nameof(builder)); ParamCheck.NotNull(modelType, nameof(modelType)); #endregion // 检查可用性。 if (!this.CanMapping(modelType)) { return; } // 映射实体类型。 var typeBuilder = builder.Entity(modelType); // 映射实体属性。 typeBuilder.Property(nameof(IChildEntityModelOfGuid <EntityModelOfGuid> .CountOfChild)) .IsRequired(); // 获取子实体模型的类型。 var cEntityModelType = modelType.FindManyTypeFromOne(); // 获取子实体类型(EF 中的 EntityType)。 var cEntityType = builder.Model.FindEntityType(cEntityModelType); // 获取子实体模型对应原表名称。 var cTableName = cEntityType.Relational().TableName; // 映射“One-to-Many”关系。 typeBuilder.HasMany(cEntityModelType, nameof(IChildEntityModelOfGuid <EntityModelOfGuid> .Children)) .WithOne(nameof(IParentEntityModelOfGuid <EntityModelOfGuid> .Parent)) .HasForeignKey(nameof(IParentEntityModelOfGuid <EntityModelOfGuid> .ParentId)) .HasConstraintName($"FK_{cTableName}_{nameof(IParentEntityModelOfGuid<EntityModelOfGuid>.ParentId)}"); }