一、引入Xcode包
Build.tt执行
总结:
1、必须指定dll路径
2、生成实体类就是Biz数据库操作类以及数据实体文件,简易实体类就是model实体模型
二、更改将Biz实体表映射到mysql,创建控制台的
运行控制台,则会根据XCode.Membership命名空间下的实体数据,与对应appsettings.json内数据库链接配置,创建数据表。
三、创建分库分表
我们将在Xcode.Membership命名空间内,dao的操作内,去创建分表
原本生成是默认继承Entity实体的,现在新建一个基类,那个表需要分表,就可以继承,在构造函数内,判断id,获取时间创建分表
代码如下:
/// <summary>分表实体基类</summary> /// <typeparam name="TEntity"></typeparam> public class ShardEntity<TEntity> : Entity<TEntity> where TEntity : Entity<TEntity>, new() { /// <summary>根据时间创建分表上下文</summary> /// <param name="time"></param> /// <returns></returns> public static IDisposable CreateShard(DateTime time) => Meta.CreateSplit(null, $"{Meta.Table.TableName}_{time:yyyyMM}"); /// <summary>根据自增创建分表上下文</summary> /// <param name="id"></param> /// <returns></returns> public static IDisposable CreateShard(Int64 id) { if (!Meta.Factory.Snow.TryParse(id, out var time, out _, out _)) throw new ArgumentOutOfRangeException(nameof(id), "该id未包含时间信息!"); return Meta.CreateSplit(null, $"{Meta.Table.TableName}_{time:yyyyMM}"); } /// <summary>获取分片标识,yyyyMM</summary> /// <param name="id"></param> /// <returns></returns> public static Int32 GetShard(Int64 id) { if (!Meta.Factory.Snow.TryParse(id, out var time, out _, out _)) return 0; return time.Year * 100 + time.Month; } }
继承使用
部分代码如下
static UserOnline() { // 累加字段,生成 Update xx Set Count=Count+1234 Where xxx //var df = Meta.Factory.AdditionalFields; //df.Add(nameof(UserID)); // 过滤器 UserModule、TimeModule、IPModule Meta.Modules.Add<TimeModule>(); Meta.Modules.Add<IPModule>(); // 自动分表策略 Meta.ShardTableName = e => $"{Meta.Table.TableName}_{e.CreateTime:yyyyMM}"; // 雪花Id设置 Meta.Factory.Snow.StartTimestamp = new DateTime(2020, 1, 1); } /// <summary>根据id查询</summary> /// <param name="boxOrderId">id</param> /// <returns>实体列表</returns> public static IList<UserOnline> FindAllById(Int64 Id) { // 分表查询 using var shard = CreateShard(Id); return FindAll(_.ID == Id); }
则会根据,用户访问User方法,构造自动创建表
遇到的问题
1、表名和字段名不能是关键字
2、分表,第一次肯定会建立基础表的即不是按月份的那种,会创建基础表+按月的表
3、用雪花id,可是还是生成 0000 结构的表,理由是:
四、码神工具
正向工程,根据现有表结构,生成xml,然后迁移到项目内,使用dao链接即可。
内部配置文件,可以自带有问题,现粘贴
<?xml version="1.0" encoding="utf-8"?> <configuration> <runtime> <gcServer enabled="true"/> </runtime> <appSettings> <add key="EnableWindowsFormsHighDpiAutoResizing" value="true"/> </appSettings> <connectionStrings> <add name="mssql" connectionString="Data Source=.;Initial Catalog=master;user=sa;password=;" providerName="System.Data.SqlClient"/> <add name="mssql2" connectionString="Data Source=.;Initial Catalog=master;user=sa;password=sa;" providerName="System.Data.SqlClient"/> <add name="mssql3" connectionString="Data Source=.;Initial Catalog=master;user=sa;password=Pass@word;" providerName="System.Data.SqlClient"/> <add name="mssql4" connectionString="Data Source=.;Initial Catalog=master;Integrated Security=True;" providerName="System.Data.SqlClient"/> <add name="Oracle" connectionString="Data Source=Tcp://127.0.0.1/ORCL;User Id=scott;Password=tiger;" providerName="System.Data.OracleClient"/> <add name="Oracle2" connectionString="Data Source=orc;User ID=admin;Password=admin" providerName="System.Data.OracleClient"/> <add name="sqlite" connectionString="Data Source=test.db;" providerName="Sqlite"/> <add name="MySql" connectionString="Server=139.155.42.67;Port=3306;Database=dev_order_center;Uid=root;Pwd=dc43d165383a20e3;" providerName="MySql.Data.MySqlClient"/> <add name="MySql2" connectionString="Server=127.0.0.1;Port=3306;Database=mysql;Uid=root;Pwd=root;" providerName="MySql.Data.MySqlClient"/> <add name="MySql3" connectionString="Server=127.0.0.1;Port=3306;Database=mysql;Uid=root;Pwd=Pass@word;" providerName="MySql.Data.MySqlClient"/> <add name="PostgreSQL" connectionString="Server=.;Database=master;Uid=root;Pwd=root;" providerName="PostgreSQL.Data.PostgreSQLClient"/> <add name="Access" connectionString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=~App_DataTest.mdb;Persist Security Info=False;OLE DB Services=-1" providerName="Access"/> <add name="SqlCe" connectionString="Data Source=test.sdf;" providerName="SqlCe"/> </connectionStrings> <System.Windows.Forms.ApplicationConfigurationSection> <add key="DpiAwareness" value="PerMonitorV2"/> </System.Windows.Forms.ApplicationConfigurationSection> </configuration>
五、魔方的使用
1、创建项目
添加区域
区域选项被折叠到了“新搭建基架的项目”中。
项目上右键“添加”-“新搭建基架的项目”
点击添加,自动创建区域目录结构如下(有两层Areas文件夹)
这里建议区域名字不要再起Areas
例如
然后,配置文件配置路由以及添加区域基类
添加基类
代码如下:
[DisplayName("用户管理")] public class UserArea : AreaBase { public UserArea() : base(nameof(UserArea).TrimEnd("Area")) { } static UserArea() => RegisterArea<UserArea>(); }
然后,子类查询
代码如下:这是二级菜单
[UserArea] [DisplayName("用户在线管理")] public class UserOnlineController : EntityController<UserOnline> { static UserOnlineController() => MenuOrder = 50; protected override IEnumerable<UserOnline> Search(Pager p) { var id = p["Id"].ToInt(-1); return UserOnline.FindAllById(id); } }
启动运行访问 http://localhost:5000/User/UserOnline,可参考 https://www.yuque.com/smartstone/cube/install
如图
只有控制器的展示,现在左边,没有菜单,这是因为魔方是iframe架构,你直接访问内部页面了,左边是没有菜单的,/admin 才会有菜单
尝试vs2019 视图文件的区域添加以及正常视图文件添加
我们应该添加对应view 文件,包含显示菜单 (vs2019有点改变,只能手动添加文件, 对应文件夹层,没有办法自动生成)
或者老办法,方法内新加View,对View右击添加视图,可以自动创建视图
如果是区域内新增则需要添加 [Area("Test")] 标识
注意:区域名称要跟你文件夹一样 ,否则哪怕能右击跳转视图,但是运行访问进入控制器后也会报错找不到指定视图