雪花

Newlife.Xcode使用

一、引入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_Data\Test.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")] 标识

 

注意:区域名称要跟你文件夹一样 ,否则哪怕能右击跳转视图,但是运行访问进入控制器后也会报错找不到指定视图

 

posted @ 2021-01-06 17:24  十色  阅读(421)  评论(0编辑  收藏  举报