首页 > 代码库 > Scut 进阶:Schema 自动检测

Scut 进阶:Schema 自动检测

  Scut 在启动时有一个自动根据代码中数据类型检查数据库字段的功能,要如何使用呢?

 

脚本引擎动态加载 ModelAssembly:

ScriptEngine.cs - InitScriptRuntimeScope:

EntitySchemaSet.LoadAssembly(scope.ModelAssembly);

EntitySchemaSet.cs - LoadAssembly:

var types = assembly.GetTypes().Where(p => p.GetCustomAttributes(typeof(EntityTableAttribute), false).Count() > 0).ToList();foreach (var type in types){  InitSchema(type);}

  可以得知,需要被检查数据库字段的,必须是 Model 文件夹下的带有“EntityTable”属性的结构。

EntitySchemaSet.cs - InitSchema:PropertyInfo[] propertyList = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);SchemaColumn column;

int number = 0;foreach (PropertyInfo property in propertyList){
   ...
  var entityField = FindAttribute<EntityFieldAttribute>(property.GetCustomAttributes(false));

    if (entityField != null)

    ...      }
... ...
CheckTableSchema(schema);

  可以得知,要与数据库进行匹配检查的字段必须带有“EntityField”。

 

EntitySchemaSet.cs - CheckTableSchema:

if (dbprovider.CheckTable(tableName, out columns)){  ModifyTableSchema(schema, dbprovider, tableName, columns);}
else{  CreateTableSchema(schema, dbprovider, tableName);}

  对比 EntityTable 的 Column 与 数据库表中的 Column,有差异进行相应修改,如果没有该表则要建表。

 

  说白了,只要配置正确了 sqlconnetion,连建表都帮你省了...

  上一篇的 EntityChangeEvent 则是省了数据 Save ... 真是傻瓜式开发了。

 

Scut 进阶:Schema 自动检测