From 9f2ffdce77ef0717e45d3df01b796e77d1599699 Mon Sep 17 00:00:00 2001
From: 28810 <28810@YEXIANGQIN>
Date: Sun, 29 Mar 2020 22:36:39 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20FreeSql.Generator=20Sq?=
=?UTF-8?q?lite=20=E6=95=B0=E6=8D=AE=E5=BA=93=E7=94=9F=E6=88=90=E5=AE=9E?=
=?UTF-8?q?=E4=BD=93=E7=B1=BB=EF=BC=9B=20-=20=E5=A2=9E=E5=8A=A0=20Sqlite?=
=?UTF-8?q?=20DbFirst=20=E5=AE=9E=E7=8E=B0=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Extensions/FreeSql.Generator/ConsoleApp.cs | 10 +-
.../FreeSql.Generator.csproj | 5 +-
Extensions/FreeSql.Generator/RazorModel.cs | 2 +-
FreeSql.DbContext/FreeSql.DbContext.xml | 9 -
.../FreeSql.Tests/Sqlite/SqliteDbFirstTest.cs | 25 ++
FreeSql.Tests/FreeSql.Tests/g.cs | 2 +-
.../FreeSql.Provider.Sqlite/SqliteDbFirst.cs | 359 ++++++++++++++++++
.../FreeSql.Provider.Sqlite/SqliteProvider.cs | 3 +-
8 files changed, 398 insertions(+), 17 deletions(-)
create mode 100644 FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteDbFirstTest.cs
create mode 100644 Providers/FreeSql.Provider.Sqlite/SqliteDbFirst.cs
diff --git a/Extensions/FreeSql.Generator/ConsoleApp.cs b/Extensions/FreeSql.Generator/ConsoleApp.cs
index c8d9e46d..c32b25ca 100644
--- a/Extensions/FreeSql.Generator/ConsoleApp.cs
+++ b/Extensions/FreeSql.Generator/ConsoleApp.cs
@@ -102,9 +102,11 @@ new Colorful.Formatter("v" + string.Join(".", typeof(ConsoleApp).Assembly.GetNam
-DB ""{8},Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=数据库;Pooling=true;Maximum Pool Size=2""
-DB ""{9},user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2""
+
+ -DB ""{10},Data Source=document.db;Attachs=xxxtb.db;""
- -DB ""{10},Driver={DM8 ODBC DRIVER};Server=127.0.0.1:5236;Persist Security Info=False;Trusted_Connection=Yes;UID=USER1;PWD=123456789;Max pool size=2""
- {10} 是国产达梦数据库,需要使用 ODBC 连接
+ -DB ""{11},Driver={DM8 ODBC DRIVER};Server=127.0.0.1:5236;Persist Security Info=False;Trusted_Connection=Yes;UID=USER1;PWD=123456789;Max pool size=2""
+ {11} 是国产达梦数据库,需要使用 ODBC 连接
-Filter Table+View+StoreProcedure
默认生成:表+视图+存储过程
@@ -113,7 +115,7 @@ new Colorful.Formatter("v" + string.Join(".", typeof(ConsoleApp).Assembly.GetNam
-FileName 文件名,默认:{name}.cs
-Output 保存路径,默认为当前 shell 所在目录
- {11}
+ {12}
", Color.SlateGray,
new Colorful.Formatter("使用 FreeSql 快速生成数据库的实体类", Color.SlateGray),
@@ -126,6 +128,7 @@ new Colorful.Formatter("MySql", Color.Yellow),
new Colorful.Formatter("SqlServer", Color.Yellow),
new Colorful.Formatter("PostgreSQL", Color.Yellow),
new Colorful.Formatter("Oracle", Color.Yellow),
+new Colorful.Formatter("Sqlite", Color.Yellow),
new Colorful.Formatter("OdbcDameng", Color.Yellow),
new Colorful.Formatter("推荐在实体类目录创建 gen.bat,双击它重新所有实体类", Color.ForestGreen)
);
@@ -165,6 +168,7 @@ new Colorful.Formatter("推荐在实体类目录创建 gen.bat,双击它重新
case "sqlserver": ArgsDbType = DataType.SqlServer; break;
case "postgresql": ArgsDbType = DataType.PostgreSQL; break;
case "oracle": ArgsDbType = DataType.Oracle; break;
+ case "sqlite": ArgsDbType = DataType.Sqlite; break;
case "odbcdameng": ArgsDbType = DataType.OdbcDameng; break;
default: throw new ArgumentException($"-DB 参数错误,不支持的类型:{dbargs[0]}");
}
diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj
index 5d8e0c49..d5aecb79 100644
--- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj
+++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj
@@ -2,7 +2,7 @@
Exe
- netcoreapp3.1;netcoreapp2.1
+ netcoreapp3.1
true
true
true
@@ -12,7 +12,7 @@
使用 FreeSql 快速生成数据库的实体类,安装:dotnet tool install -g FreeSql.Generator
https://github.com/2881099/FreeSql
https://github.com/2881099/FreeSql
- 1.3.1
+ 1.3.1.5
FreeSql DbFirst 实体生成器
@@ -27,6 +27,7 @@
+
diff --git a/Extensions/FreeSql.Generator/RazorModel.cs b/Extensions/FreeSql.Generator/RazorModel.cs
index 07e5bb6a..e2be6979 100644
--- a/Extensions/FreeSql.Generator/RazorModel.cs
+++ b/Extensions/FreeSql.Generator/RazorModel.cs
@@ -73,7 +73,7 @@ public class RazorModel {
if (col.CsType != null)
{
var dbinfo = fsql.CodeFirst.GetDbInfo(col.CsType);
- if (dbinfo != null && dbinfo.dbtypeFull.Replace("NOT NULL", "").Trim() != col.DbTypeTextFull)
+ if (dbinfo != null && string.Compare(dbinfo.dbtypeFull.Replace("NOT NULL", "").Trim(), col.DbTypeTextFull, true) != 0)
sb.Add("DbType = \"" + col.DbTypeTextFull + "\"");
if (col.IsPrimary)
sb.Add("IsPrimary = true");
diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index ddd18378..d8bba58b 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -211,15 +211,6 @@
-
-
- 批量注入 Repository,可以参考代码自行调整
-
-
-
-
-
-
动态Type,在使用 Repository<object> 后使用本方法,指定实体类型
diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteDbFirstTest.cs
new file mode 100644
index 00000000..8725e453
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteDbFirstTest.cs
@@ -0,0 +1,25 @@
+using FreeSql.DataAnnotations;
+using System;
+using Xunit;
+
+namespace FreeSql.Tests.Sqlite
+{
+ public class SqliteDbFirstTest
+ {
+ [Fact]
+ public void GetDatabases()
+ {
+
+ var t1 = g.sqlite.DbFirst.GetDatabases();
+
+ }
+
+ [Fact]
+ public void GetTablesByDatabase()
+ {
+
+ var t2 = g.sqlite.DbFirst.GetTablesByDatabase();
+
+ }
+ }
+}
diff --git a/FreeSql.Tests/FreeSql.Tests/g.cs b/FreeSql.Tests/FreeSql.Tests/g.cs
index 985eae8b..ba3a65d5 100644
--- a/FreeSql.Tests/FreeSql.Tests/g.cs
+++ b/FreeSql.Tests/FreeSql.Tests/g.cs
@@ -71,7 +71,7 @@ public class g
public static IFreeSql oracle => oracleLazy.Value;
static Lazy sqliteLazy = new Lazy(() => new FreeSql.FreeSqlBuilder()
- .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db;Attachs=xxxtb.db;")
+ .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db")
//.UseConnectionFactory(FreeSql.DataType.Sqlite, () =>
//{
// var conn = new System.Data.SQLite.SQLiteConnection(@"Data Source=|DataDirectory|\document.db;Pooling=true;");
diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteDbFirst.cs b/Providers/FreeSql.Provider.Sqlite/SqliteDbFirst.cs
new file mode 100644
index 00000000..74908fdd
--- /dev/null
+++ b/Providers/FreeSql.Provider.Sqlite/SqliteDbFirst.cs
@@ -0,0 +1,359 @@
+using FreeSql.DatabaseModel;
+using FreeSql.Internal;
+using FreeSql.Internal.Model;
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+
+namespace FreeSql.Sqlite
+{
+ class SqliteDbFirst : IDbFirst
+ {
+ IFreeSql _orm;
+ protected CommonUtils _commonUtils;
+ protected CommonExpression _commonExpression;
+ public SqliteDbFirst(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression)
+ {
+ _orm = orm;
+ _commonUtils = commonUtils;
+ _commonExpression = commonExpression;
+ }
+
+ public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column);
+ DbType GetSqlDbType(DbColumnInfo column)
+ {
+ var dbfull = column.DbTypeTextFull.ToLower();
+ switch (dbfull)
+ {
+ case "boolean": return DbType.Boolean;
+
+ case "smallint": return DbType.Int16;
+ case "integer": return DbType.Int32;
+ case "bigint": return DbType.Int64;
+
+ case "int2": return DbType.Byte;
+ case "unsigned": return DbType.Decimal;
+ case "decimal(10,0)": return DbType.Decimal;
+ case "decimal(21,0)": return DbType.Decimal;
+
+ case "double": return DbType.Double;
+ case "float": return DbType.Single;
+ case "decimal(10,2)": return DbType.Decimal;
+ case "datetime": return DbType.DateTime;
+
+ case "blob": return DbType.Binary;
+ case "nvarchar(255)": return DbType.String;
+
+ case "character(36)": return DbType.AnsiString;
+ }
+ switch (column.DbTypeText.ToLower())
+ {
+ case "int":
+ _dicDbToCs.TryAdd(dbfull, _dicDbToCs["integer"]);
+ return DbType.Int32;
+ case "tinyint":
+ _dicDbToCs.TryAdd(dbfull, _dicDbToCs["int2"]);
+ return DbType.Byte;
+ case "mediumint":
+ _dicDbToCs.TryAdd(dbfull, _dicDbToCs["bigint"]);
+ return DbType.Int64;
+ case "unsigned big int":
+ case "int8":
+ _dicDbToCs.TryAdd(dbfull, _dicDbToCs["bigint"]);
+ return DbType.Int64;
+
+ case "numeric":
+ case "decimal":
+ _dicDbToCs.TryAdd(dbfull, _dicDbToCs["decimal(10,2)"]);
+ return DbType.Decimal;
+
+ case "date":
+ case "smalldatetime":
+ _dicDbToCs.TryAdd(dbfull, _dicDbToCs["datetime"]);
+ return DbType.Date;
+
+ case "real":
+ _dicDbToCs.TryAdd(dbfull, _dicDbToCs["float"]);
+ return DbType.Double;
+ case "double precision":
+ _dicDbToCs.TryAdd(dbfull, _dicDbToCs["double"]);
+ return DbType.Double;
+
+ case "blob":
+ _dicDbToCs.TryAdd(dbfull, _dicDbToCs["blob"]);
+ return DbType.Binary;
+
+ case "character":
+ case "varchar":
+ case "varying character":
+ case "nchar":
+ case "native character":
+ case "nvarchar":
+ case "text":
+ case "clob":
+ _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar(255)"]);
+ return DbType.String;
+
+ default:
+ _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar(255)"]);
+ return DbType.String;
+ }
+ throw new NotImplementedException($"未实现 {column.DbTypeTextFull} 类型映射");
+ }
+
+ static ConcurrentDictionary _dicDbToCs = new ConcurrentDictionary(StringComparer.CurrentCultureIgnoreCase);
+ static SqliteDbFirst()
+ {
+ var defaultDbToCs = new Dictionary() {
+ { "boolean", new DbToCs("(bool?)", "{0} == \"1\"", "{0} == true ? \"1\" : \"0\"", "bool?", typeof(bool), typeof(bool?), "{0}.Value", "GetBoolean") },
+
+ { "smallint", new DbToCs("(short?)", "short.Parse({0})", "{0}.ToString()", "short?", typeof(short), typeof(short?), "{0}.Value", "GetInt16") },
+ { "integer", new DbToCs("(int?)", "int.Parse({0})", "{0}.ToString()", "int?", typeof(int), typeof(int?), "{0}.Value", "GetInt32") },
+ { "bigint", new DbToCs("(long?)", "long.Parse({0})", "{0}.ToString()", "long?", typeof(long), typeof(long?), "{0}.Value", "GetInt64") },
+
+ { "int2", new DbToCs("(byte?)", "byte.Parse({0})", "{0}.ToString()", "byte?", typeof(byte), typeof(byte?), "{0}.Value", "GetByte") },
+ { "unsigned", new DbToCs("(ushort?)", "ushort.Parse({0})", "{0}.ToString()", "ushort?", typeof(ushort), typeof(ushort?), "{0}.Value", "GetInt32") },
+ { "decimal(10,0)", new DbToCs("(uint?)", "uint.Parse({0})", "{0}.ToString()", "uint?", typeof(uint), typeof(uint?), "{0}.Value", "GetInt64") },
+ { "decimal(21,0)", new DbToCs("(ulong?)", "ulong.Parse({0})", "{0}.ToString()", "ulong?", typeof(ulong), typeof(ulong?), "{0}.Value", "GetDecimal") },
+
+ { "double", new DbToCs("(double?)", "double.Parse({0})", "{0}.ToString()", "double?", typeof(double), typeof(double?), "{0}.Value", "GetDouble") },
+ { "float", new DbToCs("(float?)", "float.Parse({0})", "{0}.ToString()", "float?", typeof(float), typeof(float?), "{0}.Value", "GetFloat") },
+ { "decimal(10,2)", new DbToCs("(decimal?)", "decimal.Parse({0})", "{0}.ToString()", "decimal?", typeof(decimal), typeof(decimal?), "{0}.Value", "GetDecimal") },
+
+ { "datetime", new DbToCs("(DateTime?)", "new DateTime(long.Parse({0}))", "{0}.Ticks.ToString()", "DateTime?", typeof(DateTime), typeof(DateTime?), "{0}.Value", "GetValue") },
+
+ { "blob", new DbToCs("(byte[])", "Convert.FromBase64String({0})", "Convert.ToBase64String({0})", "byte[]", typeof(byte[]), typeof(byte[]), "{0}", "GetValue") },
+
+ { "nvarchar(255)", new DbToCs("", "{0}.Replace(StringifySplit, \"|\")", "{0}.Replace(\"|\", StringifySplit)", "string", typeof(string), typeof(string), "{0}", "GetString") },
+ { "character(36)", new DbToCs("(Guid?)", "Guid.Parse({0})", "{0}.ToString()", "Guid?", typeof(Guid), typeof(Guid?), "{0}.Value", "GetGuid") },
+ };
+ foreach (var kv in defaultDbToCs)
+ _dicDbToCs.TryAdd(kv.Key, kv.Value);
+ }
+
+
+ public string GetCsConvert(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbTypeTextFull, out var trydc) ? (column.IsNullable ? trydc.csConvert : trydc.csConvert.Replace("?", "")) : null;
+ public string GetCsParse(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbTypeTextFull, out var trydc) ? trydc.csParse : null;
+ public string GetCsStringify(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbTypeTextFull, out var trydc) ? trydc.csStringify : null;
+ public string GetCsType(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbTypeTextFull, out var trydc) ? (column.IsNullable ? trydc.csType : trydc.csType.Replace("?", "")) : null;
+ public Type GetCsTypeInfo(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbTypeTextFull, out var trydc) ? trydc.csTypeInfo : null;
+ public string GetCsTypeValue(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbTypeTextFull, out var trydc) ? trydc.csTypeValue : null;
+ public string GetDataReaderMethod(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbTypeTextFull, out var trydc) ? trydc.dataReaderMethod : null;
+
+ public List GetDatabases()
+ {
+ return _orm.Ado.ExecuteArray("PRAGMA database_list").Select(a => string.Concat(a[1])).ToList();
+ }
+
+ public List GetTablesByDatabase(params string[] database2)
+ {
+ var loc1 = new List();
+ var loc2 = new Dictionary();
+ var loc3 = new Dictionary>();
+ var database = database2?.ToArray();
+
+ if (database == null || database.Any() == false) database = GetDatabases().ToArray();
+ if (database.Any() == false) return loc1;
+
+ Action