public override void ElementPropertyChanged(ElementPropertyChangedEventArgs e) { base.ElementPropertyChanged(e); ModelAttribute element = (ModelAttribute)e.ModelElement; ModelClass modelClass = element.ModelClass; Store store = element.Store; Transaction current = store.TransactionManager.CurrentTransaction; if (current.IsSerializing) { return; } if (Equals(e.NewValue, e.OldValue)) { return; } List <string> errorMessages = EFCoreValidator.GetErrors(element).ToList(); switch (e.DomainProperty.Name) { case "Autoproperty": if (element.AutoProperty && modelClass.ImplementNotify) { WarningDisplay.Show($"{modelClass.Name}.{element.Name} is an autoproperty, so will not participate in INotifyPropertyChanged messages"); } break; case "Indexed": if (element.IsIdentity) { element.Indexed = true; } if (element.IsConcurrencyToken) { element.Indexed = false; } if (element.Indexed) { element.Persistent = true; } break; case "Type": string newType = (string)e.NewValue; if (element.IsIdentity) { if (!ValidIdentityAttributeTypes.Contains(ModelAttribute.ToCLRType(newType))) { errorMessages.Add($"{modelClass.Name}.{element.Name}: Properties of type {newType} can't be used as identity properties."); } else { element.Required = true; element.Persistent = true; } } if (newType != "String") { element.MaxLength = 0; element.StringType = HTML5Type.None; } else { if (!element.IsValidInitialValue(newType)) { element.InitialValue = null; } } break; case "MinLength": int newMinLength = (int)e.NewValue; if (element.Type != "String") { element.MinLength = 0; } if (newMinLength < 0) { errorMessages.Add($"{modelClass.Name}.{element.Name}: MinLength must be zero or a positive number"); } break; case "MaxLength": int newMaxLength = (int)e.NewValue; if (element.Type != "String") { element.MaxLength = 0; } if (newMaxLength < 0) { errorMessages.Add($"{modelClass.Name}.{element.Name}: MaxLength must be zero or a positive number"); } break; case "IdentityType": if (element.IsIdentity) { if (element.IdentityType == IdentityType.None) { errorMessages.Add($"{modelClass.Name}.{element.Name}: Identity properties must have an identity type defined"); } else { element.AutoProperty = true; } } else if (!element.IsIdentity) { element.IdentityType = IdentityType.None; } break; case "ReadOnly": if (!element.Persistent || element.SetterVisibility != SetterAccessModifier.Public) { element.ReadOnly = false; } break; case "IsIdentity": bool newIsIdentity = (bool)e.NewValue; if (newIsIdentity) { if (element.ModelClass.IsDependentType) { errorMessages.Add($"{modelClass.Name}.{element.Name}: Can't make {element.Name} an identity because {modelClass.Name} is a dependent type and can't have an identity property."); } else { if (!ValidIdentityAttributeTypes.Contains(element.Type)) { errorMessages.Add($"{modelClass.Name}.{element.Name}: Properties of type {element.Type} can't be used as identity properties."); } else { element.IsConcurrencyToken = false; element.Indexed = true; element.IndexedUnique = true; element.Persistent = true; element.Required = true; if (element.IdentityType == IdentityType.None) { element.IdentityType = IdentityType.AutoGenerated; } } } } else { element.IdentityType = IdentityType.None; } break; case "IsConcurrencyToken": bool newIsConcurrencyToken = (bool)e.NewValue; if (newIsConcurrencyToken) { element.IsIdentity = false; element.Persistent = true; element.Required = true; } break; case "Required": bool newRequired = (bool)e.NewValue; if (!newRequired) { if (element.IsIdentity || element.IsConcurrencyToken) { element.Required = true; } } break; case "Persistent": bool newPersistent = (bool)e.NewValue; if (!newPersistent) { element.IsIdentity = false; element.Indexed = false; element.IndexedUnique = false; element.IdentityType = IdentityType.None; element.IsConcurrencyToken = false; element.Virtual = false; } break; case "Name": string newName = (string)e.NewValue; if (string.IsNullOrEmpty(newName)) { errorMessages.Add("Name must be a valid .NET identifier"); } else { ParseResult fragment; try { fragment = ModelAttribute.Parse(element.ModelClass.ModelRoot, newName); if (fragment == null) { errorMessages.Add($"{modelClass.Name}: Could not parse entry '{newName}'"); } else { if (string.IsNullOrEmpty(fragment.Name) || !CodeGenerator.IsValidLanguageIndependentIdentifier(fragment.Name)) { errorMessages.Add($"{modelClass.Name}: Property name '{fragment.Name}' isn't a valid .NET identifier"); } else if (modelClass.AllAttributes.Except(new[] { element }).Any(x => x.Name == fragment.Name)) { errorMessages.Add($"{modelClass.Name}: Property name '{fragment.Name}' already in use"); } else if (modelClass.AllNavigationProperties().Any(p => p.PropertyName == fragment.Name)) { errorMessages.Add($"{modelClass.Name}: Property name '{fragment.Name}' already in use"); } else { element.Name = fragment.Name; if (fragment.Type != null) { element.Type = fragment.Type; } if (fragment.Required != null) { element.Required = fragment.Required.Value; } if (fragment.MaxLength != null) { element.MaxLength = fragment.MaxLength.Value; } if (fragment.InitialValue != null) { element.InitialValue = fragment.InitialValue; } if (fragment.IsIdentity) { element.IsIdentity = true; // don't reset to false if not entered as part of name } } } } catch (Exception exception) { errorMessages.Add($"{modelClass.Name}: Could not parse entry '{newName}': {exception.Message}"); } } break; case "InitialValue": string newInitialValue = (string)e.NewValue; if (!element.IsValidInitialValue(null, newInitialValue)) { errorMessages.Add($"{modelClass.Name}.{element.Name}: {newInitialValue} isn't a valid value for {element.Type}"); } break; } errorMessages = errorMessages.Where(m => m != null).ToList(); if (errorMessages.Any()) { current.Rollback(); ErrorDisplay.Show(string.Join("\n", errorMessages)); } }
/// <summary> /// Common Process for any Object(Model) and Objects's Property /// </summary> /// <param name="TModel"></param> /// <returns>arrar of ModelAttribute and List<ObjectParameter> </returns> public object[] GetModalWithParameters(T TModel, string OperationName) { var allModelAttributes = TModel.GetType().GetCustomAttributes(true); ModelAttribute objModelAttribute = null; foreach (var attribute in allModelAttributes) { if (attribute.GetType() == typeof(ModelAttribute)) { objModelAttribute = attribute as ModelAttribute; break; } } if (objModelAttribute == null) { return new object[] { } } ; //To generate the list of SqlParameters var objectParameters = new List <ObjectParameter>(); foreach (var objModelProperty in TModel.GetType().GetProperties()) { var allPropertyAttributes = objModelProperty.GetCustomAttributes(true); ModelPropertyAttribute objModelPropertyAttribute = null; foreach (var attribute in allPropertyAttributes) { if (attribute.GetType() == typeof(ModelPropertyAttribute)) { objModelPropertyAttribute = attribute as ModelPropertyAttribute; break; } } var operationFlg = objModelPropertyAttribute != null && (OperationName.Equals("DELETE") == objModelPropertyAttribute.IsDeleteParameter || OperationName.Equals("INSERT") == objModelPropertyAttribute.IsInsertParameter || OperationName.Equals("SELECT") == objModelPropertyAttribute.IsSelectParameter || OperationName.Equals("UPDATE") == objModelPropertyAttribute.IsUpdateParameter); if (operationFlg) { var proValue = objModelProperty.GetValue(TModel, new object[] { }); var proTypeFullName = objModelProperty.PropertyType.FullName; var proType = Type.GetType((proTypeFullName.Contains("System.Nullable") && proTypeFullName.Split(new string[] { "[[" }, StringSplitOptions.RemoveEmptyEntries).Length > 1) ? proTypeFullName.Split(new string[] { "[[" }, StringSplitOptions.RemoveEmptyEntries)[1].Split(',')[0] : proTypeFullName); objectParameters.Add(proValue != null ? new ObjectParameter(objModelPropertyAttribute.ParameterName, proValue) : new ObjectParameter(objModelPropertyAttribute.ParameterName, proType)); } } return(new object[] { objModelAttribute, objectParameters }); } }
public static string nameSpace = ""; //命名空间 /// <summary> /// 生成MVC中的MC /// </summary> /// <param name="modelProperties">类字段信息</param> /// <param name="modelAttribute">表信息</param> /// <returns>返回true表示生成成功, 否则失败</returns> public static bool GenerateMC(List <ModelProperty> modelProperties, ModelAttribute modelAttribute) { return(GenerateModel(modelProperties, modelAttribute) && GenerateController(modelAttribute)); }
/// <summary> /// 生成Model /// </summary> /// <param name="modelProperties">类字段信息</param> /// <param name="modelAttribute">表信息</param> /// <returns>返回true表示生成成功, 否则失败</returns> public static bool GenerateModel(List <ModelProperty> modelProperties, ModelAttribute modelAttribute) { StringBuilder sb = new StringBuilder(); sb.Append("using System;\n"); sb.Append("using EasyFramework.Attr;\n"); sb.Append("using EasyFramework.Models;\n"); sb.Append(string.Format("namespace {0}.Models\n", nameSpace)); sb.Append("{\n"); sb.Append(string.Format(" [Model(\"{0}\", \"{1}\")]\n", modelAttribute.TableName, modelAttribute.PrimaryKey)); sb.Append(string.Format(" public class {0} : BaseModel\n", modelAttribute.TableName)); sb.Append(" {\n"); foreach (ModelProperty modelProperty in modelProperties) { //字段类型 string type = ""; //字段长度信息 string lengthInfo = ""; //字段默认值 string _default = string.IsNullOrEmpty(modelProperty.Default) ? "" : string.Format(", Default = \"{0}\"", modelProperty.Default); //说明 string explain = string.IsNullOrEmpty(modelProperty.Explain) ? "" : string.Format(", Explain = \"{0}\"", modelProperty.Explain); //能否为空 string IsNull = string.Format(", IsNull = {0}", modelProperty.IsNull.ToString().ToLower()); switch (MSDBType.GetTypeBySqlTypeName(modelProperty.ColType).Name) { case "String": type = "string"; lengthInfo = string.Format(", MinLength = {0}, MaxLength = {1}", modelProperty.MinLength, modelProperty.MaxLength); break; case "Int32": type = "int"; break; case "Boolean": type = "bool"; break; case "DateTime": type = "DateTime"; break; case "Double": type = "double"; break; } sb.Append(string.Format(" [ModelProperty(\"{0}\", \"{1}\"{2}{3}{4}{5})]\n", modelProperty.ColName, modelProperty.ColType, lengthInfo, _default, explain, IsNull)); sb.Append(string.Format(" public {0} {1} {2}\n\n", type, modelProperty.ColName, "{ get; set; }")); } sb.Append(" }\n"); sb.Append("}"); try { FileStream fs = new FileStream(string.Format("{0}/Models/{1}.cs", path, modelAttribute.TableName), FileMode.Create); byte[] bytes = Encoding.UTF8.GetBytes(sb.ToString()); fs.Write(bytes, 0, bytes.Length); fs.Close(); GenerateLog4Net(); } catch (Exception e) { string sss = e.Message; return(false); } return(true); }
private static string CreateShadowPropertyName(Association association, List<string> foreignKeyColumns, ModelAttribute identityAttribute) { string shadowNameBase = association.SourceRole == EndpointRole.Dependent ? association.TargetPropertyName : association is BidirectionalAssociation b ? b.SourcePropertyName : $"{association.Source.Name}.{association.TargetPropertyName}"; string shadowPropertyName = $"{shadowNameBase}_{identityAttribute.Name}"; int index = 0; while (foreignKeyColumns.Contains(shadowPropertyName)) shadowPropertyName = $"{shadowNameBase}{++index}_{identityAttribute.Name}"; return shadowPropertyName; }
/// <summary> /// 生成三层中的DAL /// </summary> /// <param name="modelProperties">类字段信息</param> /// <param name="modelAttribute">表信息</param> /// <returns>返回true表示生成成功, 否则失败</returns> public static bool GenerateDAL(List <ModelProperty> modelProperties, ModelAttribute modelAttribute) { return(false); }
public void CorrectlySetsDefaultValues() { var modelAttribute = new ModelAttribute(); Assert.AreEqual(true, modelAttribute.SupportIEditableObject); }
public void FakeTest() { ModelAttribute attribute = new ModelAttribute(); }
public override void ElementPropertyChanged(ElementPropertyChangedEventArgs e) { base.ElementPropertyChanged(e); ModelAttribute element = (ModelAttribute)e.ModelElement; ModelClass modelClass = element.ModelClass; Store store = element.Store; Transaction current = store.TransactionManager.CurrentTransaction; if (current.IsSerializing) { return; } string errorMessage = null; switch (e.DomainProperty.Name) { case "Indexed": if (element.IsIdentity) { element.Indexed = true; } if (element.IsConcurrencyToken) { element.Indexed = false; } if (element.Indexed) { element.Persistent = true; } break; case "Type": string newType = (string)e.NewValue; if (element.IsIdentity) { if (!ValidIdentityAttributeTypes.Contains(ModelAttribute.ToCLRType(newType))) { errorMessage = $"Properties of type {newType} can't be used as identity properties."; } else { element.Required = true; element.Persistent = true; } } if (newType != "String") { element.MaxLength = 0; element.StringType = HTML5Type.None; } else { if (!element.IsValidInitialValue(newType)) { element.InitialValue = null; } } break; case "MaxLength": int newMaxLength = (int)e.NewValue; if (element.Type != "String") { element.MaxLength = 0; } if (newMaxLength < 0) { errorMessage = "MaxLength must be zero or a positive number"; } break; case "IdentityType": if (element.IsIdentity) { if (element.IdentityType == IdentityType.None) { errorMessage = "Identity properties must have an identity type defined"; } else { element.AutoProperty = true; } } else if (!element.IsIdentity) { element.IdentityType = IdentityType.None; } break; case "ReadOnly": if (!element.Persistent || element.SetterVisibility != SetterAccessModifier.Public) { element.ReadOnly = false; } break; //case "Virtual": // if (element.Persistent) // element.Virtual = false; // break; case "IsIdentity": bool newIsIdentity = (bool)e.NewValue; if (newIsIdentity) { if (!ValidIdentityAttributeTypes.Contains(element.Type)) { errorMessage = $"Properties of type {element.Type} can't be used as identity properties."; } else { element.IsConcurrencyToken = false; element.Indexed = true; element.IndexedUnique = true; element.Persistent = true; element.Required = true; if (element.IdentityType == IdentityType.None) { element.IdentityType = IdentityType.AutoGenerated; } } } else { element.IdentityType = IdentityType.None; } break; case "IsConcurrencyToken": bool newIsConcurrencyToken = (bool)e.NewValue; if (newIsConcurrencyToken) { element.IsIdentity = false; element.Persistent = true; element.Required = true; } break; case "Required": bool newRequired = (bool)e.NewValue; if (!newRequired) { if (element.IsIdentity || element.IsConcurrencyToken) { element.Required = true; } } break; case "Persistent": bool newPersistent = (bool)e.NewValue; if (!newPersistent) { element.IsIdentity = false; element.Indexed = false; element.IndexedUnique = false; element.IdentityType = IdentityType.None; element.IsConcurrencyToken = false; element.Virtual = false; } break; case "Name": string newName = (string)e.NewValue; if (string.IsNullOrEmpty(newName)) { errorMessage = "Name must be a valid .NET identifier"; } else { ParseResult fragment = ModelAttribute.Parse(element.ModelClass.ModelRoot, newName); if (fragment == null) { errorMessage = $"Could not parse entry '{newName}'"; } else { if (string.IsNullOrEmpty(fragment.Name) || !CodeGenerator.IsValidLanguageIndependentIdentifier(fragment.Name)) { errorMessage = "Name must be a valid .NET identifier"; } else if (modelClass.AllAttributes.Except(new[] { element }).Any(x => x.Name == fragment.Name)) { errorMessage = "Property name already in use"; } else if (modelClass.AllNavigationProperties().Any(p => p.PropertyName == fragment.Name)) { errorMessage = "Property name already in use"; } else { element.Name = fragment.Name; if (fragment.Type != null) { element.Type = fragment.Type; } if (fragment.Required != null) { element.Required = fragment.Required.Value; } if (fragment.MaxLength != null) { element.MaxLength = fragment.MaxLength.Value; } if (fragment.InitialValue != null) { element.InitialValue = fragment.InitialValue; } if (fragment.IsIdentity) { element.IsIdentity = true; // don't reset to false if not entered as part of name } } } } break; case "InitialValue": string newInitialValue = (string)e.NewValue; if (!element.IsValidInitialValue(null, newInitialValue)) { errorMessage = $"{newInitialValue} isn't a valid value for {element.Type}"; } break; } if (errorMessage != null) { current.Rollback(); MessageBox.Show(errorMessage); } }
/// <summary> /// 动态函数 /// </summary> /// <param name="type"></param> /// <param name="attribute"></param> public ToArray(Type type, ModelAttribute attribute) { this.attribute = attribute; dynamicMethod = new DynamicMethod("SqlModelToArray", null, new Type[] { type, typeof(object[]), Field.RefIntType, typeof(Table) }, type, true); generator = dynamicMethod.GetILGenerator(); }
// 获得解析后的Model数据 public static ParsedModel GetParsedModel(Type type) { if (!ParsedModels.ContainsKey(type)) { ParsedModel temp = new ParsedModel(); ModelAttribute m = type.GetCustomAttribute <ModelAttribute>(); if (m == null) { throw new Exception(string.Format("模型类{0}未使用ModelAttribute,[Model(TableName = \"t_article\", PrimaryKey = \"id\", IdentityInsert = true)]", type.Name)); } else { temp.Model = m; } temp.WebableFields = new Dictionary <string, FieldAttribute>(); temp.StorageableFields = new Dictionary <string, FieldAttribute>(); PropertyInfo[] properties = type.GetProperties(); // 获得此模型的公共属性 foreach (PropertyInfo pi in properties) { FieldAttribute fa = pi.GetCustomAttribute <FieldAttribute>(); if (fa == null) { fa = new FieldAttribute(); } if (fa.FieldName == null || fa.FieldName == "") { fa.FieldName = pi.Name; // 检测是否指定了数据库表名 } if (fa.FieldName == m.PrimaryKey) // 检测是否是主键 { fa.SetIsPrimaryKey(true); fa.SetIdentityInsert(m.IdentityInsert); } if (fa.IsPrimaryKey) // 如果是主键则不能为空 { fa.Nullable = false; } else if (fa.Nullable == false && fa.Default == null) // 如果可为空,则必须指定默认值 { throw new Exception(string.Format("模型类{0}的字段{1}不可为空,需要提供Default默认值", m.TableName, pi.Name)); } fa.SetPropertyInfo(pi); if (fa.DataType == null) { fa.DataType = GetDataType(fa.PropertyInfo.PropertyType); // 如果未指定数据类型,则指定默认类型 } if (fa.Storageable) { temp.StorageableFields.Add(pi.Name, fa); } if (fa.Webable) { temp.WebableFields.Add(pi.Name, fa); } } ParsedModels.Add(type, temp); } return(ParsedModels[type]); }
public void CorrectlySetsDefault_SupportValidation() { var modelAttribute = new ModelAttribute(); Assert.AreEqual(true, modelAttribute.SupportValidation); }
/// <summary> /// 判断数据类型 /// </summary> /// <param name="modelAttribute"></param> /// <param name="value"></param> private void CheckType(ModelAttribute modelAttribute, string value) { switch (modelAttribute.DataType) { case DbType.AnsiString: break; case DbType.AnsiStringFixedLength: break; case DbType.Binary: break; case DbType.Boolean: if (!IsValidType.IsBool(value)) { throw new Exception(modelAttribute.Name + ":数据类型不对.<br/>"); } break; case DbType.Byte: break; case DbType.Currency: break; case DbType.Date: break; case DbType.DateTime: if (!IsValidType.IsDateTime(value)) { throw new Exception(modelAttribute.Name + ":时间格式不对.<br/>"); } break; case DbType.DateTime2: break; case DbType.DateTimeOffset: break; case DbType.Decimal: if (!IsValidType.IsDecimal(value)) { throw new Exception(modelAttribute.Name + ":数据类型不对.<br/>"); } break; case DbType.Double: if (!IsValidType.IsDouble(value)) { throw new Exception(modelAttribute.Name + ":数据类型不对.<br/>"); } break; case DbType.Guid: break; case DbType.Int16: if (!IsValidType.IsInt16(value)) { throw new Exception(modelAttribute.Name + ":数据类型不对.<br/>"); } break; case DbType.Int32: if (!IsValidType.IsInt32(value)) { throw new Exception(modelAttribute.Name + ":数据类型不对.<br/>"); } break; case DbType.Int64: if (!IsValidType.IsInt64(value)) { throw new Exception(modelAttribute.Name + ":数据类型不对.<br/>"); } break; case DbType.Object: break; case DbType.SByte: break; case DbType.Single: break; case DbType.String: break; case DbType.StringFixedLength: break; case DbType.Time: if (!IsValidType.IsDateTime(value)) { throw new Exception(modelAttribute.Name + ":数据类型不对.<br/>"); } break; case DbType.UInt16: break; case DbType.UInt32: break; case DbType.UInt64: break; case DbType.VarNumeric: break; case DbType.Xml: break; default: break; } }
public virtual void InitByType(Type type, bool extractGeneric = true) { if (extractGeneric) { type = Store.GetEnumerableGenericType(type); } ModelMetadata metadata = ModelMetadataProviders.Current.GetMetadataForType(null, type); if (metadata != null) { var storeModel = this.Model.Primary; if (storeModel == null) { storeModel = new Model(); this.Model.Add(storeModel); } ModelAttribute storeModelAttr = metadata.AdditionalValues.ContainsKey(ModelAttribute.KEY) ? (ModelAttribute)metadata.AdditionalValues[ModelAttribute.KEY] : null; if (storeModelAttr != null) { storeModelAttr.CopyTo(storeModel); } if (metadata.AdditionalValues.ContainsKey(AbstractValidationAttribute.KEY)) { storeModel.Validations.AddRange((ValidationCollection)metadata.AdditionalValues[AbstractValidationAttribute.KEY]); } if (metadata.AdditionalValues.ContainsKey(AbstractAssociationAttribute.KEY)) { storeModel.Associations.AddRange((AssociationCollection)metadata.AdditionalValues[AbstractAssociationAttribute.KEY]); } if (metadata.AdditionalValues.ContainsKey(ProxyAttribute.KEY)) { this.Proxy.Add((AbstractProxy)metadata.AdditionalValues[ProxyAttribute.KEY]); } if (metadata.AdditionalValues.ContainsKey(AbstractReaderAttribute.KEY)) { if (this.Proxy.Primary != null && this.Proxy.Primary is ServerProxy) { ((ServerProxy)this.Proxy.Primary).Reader.Add((AbstractReader)metadata.AdditionalValues[AbstractReaderAttribute.KEY]); } else { this.Reader.Add((AbstractReader)metadata.AdditionalValues[AbstractReaderAttribute.KEY]); } } if (metadata.AdditionalValues.ContainsKey(AbstractWriterAttribute.KEY)) { if (this.Proxy.Primary != null && this.Proxy.Primary is ServerProxy) { ((ServerProxy)this.Proxy.Primary).Writer.Add((AbstractWriter)metadata.AdditionalValues[AbstractWriterAttribute.KEY]); } else { this.Writer.Add((AbstractWriter)metadata.AdditionalValues[AbstractWriterAttribute.KEY]); } } var virtualFieldsAttr = metadata.AdditionalValues.ContainsKey(ModelFieldAttribute.KEY) ? (List <VirtualModelField>)metadata.AdditionalValues[ModelFieldAttribute.KEY] : null; if (virtualFieldsAttr != null) { foreach (VirtualModelField attr in virtualFieldsAttr) { var modelField = new ModelField(); if (storeModel != null) { attr.CopyTo(modelField, storeModel); storeModel.Fields.Add(modelField); } } } var registrator = metadata.AdditionalValues.ContainsKey(ClientResourceAttribute.KEY) ? (ResourcesRegistrator)metadata.AdditionalValues[ClientResourceAttribute.KEY] : null; if (registrator != null) { this.Controls.Add(registrator); } foreach (ModelMetadata propertyMetadata in metadata.Properties) { var modelAttr = propertyMetadata.AdditionalValues.ContainsKey(ModelFieldAttribute.KEY) ? (ModelFieldAttribute)propertyMetadata.AdditionalValues[ModelFieldAttribute.KEY] : null; if (modelAttr == null && this.InitForModelOnly) { continue; } if (modelAttr != null && modelAttr.Ignore) { continue; } Store.CreateModelFieldFromMeta(propertyMetadata, storeModel, modelAttr, this.ControllerContext); } } }
bool IsNullable(ModelAttribute modelAttribute) { return !modelAttribute.Required && !modelAttribute.IsIdentity && !modelAttribute.IsConcurrencyToken && !NonNullableTypes.Contains(modelAttribute.Type); }
/// <summary> /// 动态函数 /// </summary> /// <param name="type"></param> /// <param name="attribute"></param> public Verifyer(Type type, ModelAttribute attribute) { this.attribute = attribute; dynamicMethod = new DynamicMethod("SqlModelVerifyer", typeof(bool), new Type[] { type, typeof(MemberMap), typeof(Table) }, type, true); generator = dynamicMethod.GetILGenerator(); }
//生成代码 private void btn_Generate_Click(object sender, EventArgs e) { if (dgv_TableDetails.Rows.Count < 1) { //读取字段为0 MessageBox.Show("没有数据能够生成"); } else if (conn == null || conn.State != ConnectionState.Open) { //数据库连接关闭或异常 MessageBox.Show("与数据库的连接已经断开, 请尝试断开后重新连接"); } else { MSSqlAutoGenerationHelper.path = txt_Path.Text.Trim(); MSSqlAutoGenerationHelper.nameSpace = txt_NameSpace.Text.Trim(); //代码生成 #region 生成主要代码 //表信息 ModelAttribute modelAttribute = new ModelAttribute() { TableName = cbb_Tables.Text }; //该模型字段信息 List <ModelProperty> modelProperties = new List <ModelProperty>(); foreach (DataGridViewRow row in dgv_TableDetails.Rows) { if (string.IsNullOrEmpty(modelAttribute.PrimaryKey) && !string.IsNullOrEmpty(row.Cells["IsPrimaryKey"].Value.ToString())) { modelAttribute.PrimaryKey = row.Cells["FieldName"].Value.ToString();//表主键 } //字段信息 ModelProperty modelProperty = new ModelProperty() { ColName = row.Cells["FieldName"].Value.ToString(), ColType = row.Cells["FieldType"].Value.ToString(), Default = row.Cells["FieldDefaultValue"].Value.ToString(), Explain = row.Cells["FieldDescribe"].Value.ToString(), IsNull = string.IsNullOrEmpty(row.Cells["IsNull"].Value.ToString()), MinLength = 0, MaxLength = Convert.ToInt32(row.Cells["FieldLength"].Value.ToString()), }; modelProperties.Add(modelProperty); } #endregion switch ((cbb_Mode.SelectedItem as ListItem).Value) { case "MC": //生成MVC模式中的Model和Controller //生成的路径 string path = txt_Path.Text; //判断Controllers文件夹是否存在 if (!Directory.Exists(path + "/Controllers")) { //不存在则创建 一般来说创建MVC项目时会有 Directory.CreateDirectory(path + "/Controllers"); } //判断Models文件夹是否存在 if (!Directory.Exists(path + "/Models")) { // 不存在则创建 Directory.CreateDirectory(path + "/Models"); } //调用生成方法生成MC if (MSSqlAutoGenerationHelper.GenerateMC(modelProperties, modelAttribute)) { txt_Msg.Text += "成功生成" + cbb_Mode.Text + ", 数据库表名:" + cbb_Tables.Text + ";\r\n"; MessageBox.Show("生成成功"); } break; case "DAL": //生成普通三成架构中的DAL if (!Directory.Exists(txt_Path.Text + "/CodeAutoGeneration/Adapter")) { // 不存在则创建 Directory.CreateDirectory(txt_Path.Text + "/CodeAutoGeneration/Adapter"); } if (MSSqlAutoGenerationHelper.GenerateDAL(modelProperties, modelAttribute)) { txt_Msg.Text += "成功生成" + cbb_Mode.Text + ", 数据库表名:" + cbb_Tables.Text + ";\r\n"; MessageBox.Show("生成成功"); } break; case "Model": //只生成Model //判断Models文件夹是否存在 if (!Directory.Exists(txt_Path.Text + "/CodeAutoGeneration/Models")) { // 不存在则创建 Directory.CreateDirectory(txt_Path.Text + "/CodeAutoGeneration/Models"); } if (MSSqlAutoGenerationHelper.GenerateModel(modelProperties, modelAttribute)) { txt_Msg.Text += "成功生成" + cbb_Mode.Text + ", 数据库表名:" + cbb_Tables.Text + ";\r\n"; MessageBox.Show("生成成功"); } break; } //代码生成配置文件(数据库连接信息等) if (!Directory.Exists(txt_Path.Text + "/bin")) { //创建bin文件夹 Directory.CreateDirectory(txt_Path.Text + "/bin"); } GenerateConfigFile(); } }