Db First 实体生成

 

一、代码:快捷生成实体

只能满足常规要求,个性化太高的用 234方案

1.代码生成实体到指定目录

db.DbFirst.IsCreateAttribute().CreateClassFile("c:\\Demo\\1", "Models");
//参数1:路径  参数2:命名空间
//IsCreateAttribute 代表生成SqlSugar特性

新功能1:格式化文件名

db.DbFirst.FormatFileName(x => x.ToLower()).CreateClassFile("c\\");
//格式化类名和字段名 看标题6

新功能2: NET 7 字符串是否需要?设置

db.DbFirst.StringNullable().CreateClassFile("c\\");//强制可以空类型string加上?

2.生成实体并且带有筛选

db.DbFirst.Where("Student").CreateClassFile("c:\\Demo\\2", "Models");
db.DbFirst.Where(it => it.ToLower().StartsWith("view")).CreateClassFile("c:\\Demo\\3", "Models");
db.DbFirst.Where(it => it.ToLower().StartsWith("view")).CreateClassFile("c:\\Demo\\4", "Models");

3.生成带有SqlSugar特性的实体

db.DbFirst.IsCreateAttribute().CreateClassFile("c:\\Demo\\5", "Models");

4.生成实体带有默认值

db.DbFirst.IsCreateDefaultValue().CreateClassFile("c:\\Demo\\6", "Demo.Models");

5.自定义格式化功能

新功能格式化 5.0.7.6

添加 SettingPropertyTemplate重载(上面该属性功能比较弱),加强自定义属性的定义功能

  db.DbFirst
            //类
            .SettingClassTemplate(old => { return old;/*修改old值替换*/ })
            //类构造函数
            .SettingConstructorTemplate(old =>{return old;/*修改old值替换*/ })
             .SettingNamespaceTemplate(old => {
                            return old + "\r\nusing SqlSugar;"; //追加引用SqlSugar
                        })
            //属性备注
            .SettingPropertyDescriptionTemplate(old =>{ return old;/*修改old值替换*/})
            
            //属性:新重载 完全自定义用配置
            .SettingPropertyTemplate((columns,temp,type) => {
             
            var columnattribute = "\r\n           [SugarColumn({0})]";
            List<string> attributes = new List<string>();
            if (columns.IsPrimarykey)
                attributes.Add("IsPrimaryKey=true");
            if (columns.IsIdentity)
                attributes.Add("IsIdentity=true");
            if (attributes.Count == 0) 
            {
                columnattribute = "";
            }
            return temp.Replace("{PropertyType}", type)
                        .Replace("{PropertyName}", columns.DbColumnName)
                        .Replace("{SugarColumn}",string.Format(columnattribute,string.Join(",", attributes)));
              })
              
           .CreateClassFile("c:\\Demo\\7");


6.格式化类名和属性名

foreach (var item in db.DbMaintenance.GetTableInfoList())
{
     string entityName = item.Name.ToUpper();/*实体名大写*/
     db.MappingTables.Add(entityName , item.Name);
     foreach (var col in db.DbMaintenance.GetColumnInfosByTableName(item.Name))
     {
       db.MappingColumns.Add(col.DbColumnName.ToUpper() /*类的属性大写*/, col.DbColumnName, entityName);
     }
}
db.DbFirst.IsCreateAttribute().CreateClassFile("c:\\Demo\\8", "Models");

//格式化文件名
db.DbFirst.IsCreateAttribute().FormatFileName(x => x.ToLower()).CreateClassFile("c\\");

生成的实体如下

using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace Models
{
    ///<summary>
    ///
    ///</summary>
    [SugarTable("Order")]
    public partial class ORDER
    {
           public ORDER(){
           }
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:False
           /// </summary>           
           [SugarColumn(IsPrimaryKey=true,IsIdentity=true,ColumnName="Id")]
           public int ID {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:False
           /// </summary>           
           [SugarColumn(ColumnName="Name")]
           public string NAME {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:False
           /// </summary>           
           [SugarColumn(ColumnName="Price")]
           public decimal PRICE {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>           
           [SugarColumn(ColumnName="CreateTime")]
           public DateTime? CREATETIME {get;set;}
    }
}


二、代码:Razor模版生成

1.使用用例

    SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
    {
                ConnectionString = Config.ConnectionString,
                DbType = DbType.SqlServer,
                IsAutoCloseConnection = true,
                ConfigureExternalServices = new ConfigureExternalServices()
                {
                    RazorService = new RazorService()//新建一个RazorService类 
                }
     });

    var templte = RazorFirst.DefaultRazorClassTemplate;//这个是自带的,这个模版可以修改
    db.DbFirst.UseRazorAnalysis(templte).CreateClassFile("c:\\Demo\\Razor\\");

RazorService 类在framework和.net Core中小有区别看下面例子

2.net  framework : 

创建RazorService 需要安装RazorEngine 3.10.0.0   

using RazorEngine;
using RazorEngine.Templating;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SqlSugar.DbFirstExtensions
{
    public class RazorService : IRazorService
    {
        public List<KeyValuePair<string,string>> GetClassStringList(string razorTemplate, List<RazorTableInfo> model)
        {
            if (model != null && model.Any())
            {
                var  result = new List<KeyValuePair<string, string>>();
                foreach (var item in model)
                {
                    try
                    {
                        item.ClassName = item.DbTableName;//格式化类名
                        string key = "RazorService.GetClassStringList"+ razorTemplate.Length;
                        var classString = Engine.Razor.RunCompile(razorTemplate, key, item.GetType(), item);
                        result.Add(new KeyValuePair<string,string>(item.ClassName,classString));
                    }
                    catch (Exception ex)
                    {
                        new Exception(item.DbTableName + " error ." + ex.Message);
                    }
                }
                return result;
            }
            else
            {
                return new List<KeyValuePair<string, string>> ();
            }
        }
    }
}

3.net core |.net5 | .net6

创建RazorService 需要安装 RazorEngine.NetCore 3.1

using RazorEngine;
using RazorEngine.Templating;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;

namespace DbFirstRazorTest
{
    class Program
    {
        static void Main(string[] args)
        {

            SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
            {
                ConnectionString = "server=.;uid=sa;pwd=sasa;database=SQLSUGAR4XTEST",
                DbType = DbType.SqlServer,
                IsAutoCloseConnection = true,
                ConfigureExternalServices = new ConfigureExternalServices()
                {
                    RazorService = new RazorService()
                }
            });

            db.DbFirst.UseRazorAnalysis(RazorFirst.DefaultRazorClassTemplate).CreateClassFile("c:\\Demo\\Razor\\");

        }
    }
    public class RazorService : IRazorService
    {
        public List<KeyValuePair<string, string>> GetClassStringList(string razorTemplate, List<RazorTableInfo> model)
        {
            if (model != null && model.Any())
            {
                var result = new List<KeyValuePair<string, string>>();
                foreach (var item in model)
                {
                    try
                    {
                        item.ClassName = item.DbTableName;//格式化类名
                        string key = "RazorService.GetClassStringList" + razorTemplate.Length;
                        var classString = Engine.Razor.RunCompile(razorTemplate, key, item.GetType(), item);
                        result.Add(new KeyValuePair<string, string>(item.ClassName, classString));
                    }
                    catch (Exception ex)
                    {
                        new Exception(item.DbTableName + " error ." + ex.Message);
                    }
                }
                return result;
            }
            else
            {
                return new List<KeyValuePair<string, string>>();
            }
        }
    }
}

三、工具WebFirst生成实体

编译好的EXE下载址:https://www.donet5.com/Doc/11/2388

1.点击菜单

image.png

2.选择数据库

image.png

3.导入表

image.png

4.完成

image.png

5.数据库更新实体

当数据库表发生变化,同步后的实体也会发生变化

image.png

详细使用文档: https://www.donet5.com/Doc/11


四、自个写生成器

下面方法可以拿到信息

//例1 获取所有表
var tables = db.DbMaintenance.GetTableInfoList(false);//true 走缓存 false不走缓存
foreach (var table in tables)
{
     Console.WriteLine(table.Description);//输出表信息
}

下面方法可以拿到信息

 db.DbMaintenance.GetColumnInfosByTableName(表名, false)


文档:SqlSugar5.0