diff --git a/Examples/repository_01/Controllers/SongController.cs b/Examples/repository_01/Controllers/SongController.cs index 46a48d7b..9c874530 100644 --- a/Examples/repository_01/Controllers/SongController.cs +++ b/Examples/repository_01/Controllers/SongController.cs @@ -8,6 +8,11 @@ using System.Threading.Tasks; namespace restful.Controllers { + public class SongRepository : GuidRepository { + public SongRepository(IFreeSql fsql) : base(fsql) { + } + } + [Route("restapi/[controller]")] public class SongsController : Controller { @@ -17,8 +22,10 @@ namespace restful.Controllers { public int Id { get; set; } } + + public SongsController(IFreeSql fsql, - GuidRepository repos1, + GuidRepository repos1, GuidRepository repos2, DefaultRepository repos11, @@ -26,7 +33,9 @@ namespace restful.Controllers { BaseRepository repos3, BaseRepository repos4, IBasicRepository repos31, IBasicRepository repos41, - IReadOnlyRepository repos311, IReadOnlyRepository repos411 + IReadOnlyRepository repos311, IReadOnlyRepository repos411, + + SongRepository reposSong ) { _songRepository = repos4; @@ -35,6 +44,16 @@ namespace restful.Controllers { var curd2 = fsql.GetRepository(); var curd3 = fsql.GetRepository(); var curd4 = fsql.GetGuidRepository(); + + Console.WriteLine(repos1.Select.ToSql()); + Console.WriteLine(reposSong.Select.ToSql()); + + Console.WriteLine(repos2.Select.ToSql()); + Console.WriteLine(repos21.Select.ToSql()); + + using (reposSong.DataFilter.DisableAll()) { + Console.WriteLine(reposSong.Select.ToSql()); + } } [HttpGet] diff --git a/Examples/repository_01/Startup.cs b/Examples/repository_01/Startup.cs index f8d2bfc3..e4d47c1d 100644 --- a/Examples/repository_01/Startup.cs +++ b/Examples/repository_01/Startup.cs @@ -1,5 +1,6 @@ using Autofac; using Autofac.Extensions.DependencyInjection; +using FreeSql; using FreeSql.DataAnnotations; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; @@ -67,8 +68,9 @@ namespace repository_01 { var builder = new ContainerBuilder(); - builder.RegisterFreeRepository(filter => - filter.Apply("test", a => a.Title == DateTime.Now.ToString() + System.Threading.Thread.CurrentThread.ManagedThreadId) + builder.RegisterFreeRepository( + filter => filter.Apply("test", a => a.Title == DateTime.Now.ToString() + System.Threading.Thread.CurrentThread.ManagedThreadId), + this.GetType().Assembly ); builder.Populate(services); diff --git a/Examples/repository_01/appsettings.Development.json b/Examples/repository_01/appsettings.Development.json index e203e940..86f6b8f7 100644 --- a/Examples/repository_01/appsettings.Development.json +++ b/Examples/repository_01/appsettings.Development.json @@ -1,9 +1,9 @@ { "Logging": { - "LogLevel": { - "Default": "Debug", - "System": "Information", - "Microsoft": "Information" - } + "LogLevel": { + "Default": "Debug", + "System": "Warning", + "Microsoft": "Warning" + } } } diff --git a/FreeSql.Repository/DataFilter.cs b/FreeSql.Repository/DataFilter.cs index bdd9417f..63c435b0 100644 --- a/FreeSql.Repository/DataFilter.cs +++ b/FreeSql.Repository/DataFilter.cs @@ -6,7 +6,7 @@ using System.Text; using System.Linq; namespace FreeSql { - public interface IDataFilter where TEntity : class { + public interface IDataFilter : IDisposable where TEntity : class { IDataFilter Apply(string filterName, Expression> filterAndValidateExp); @@ -121,13 +121,20 @@ namespace FreeSql { if (filterName == null) return false; return _filters.TryGetValue(filterName, out var tryfi) ? tryfi.IsEnabled : false; } + + ~DataFilter() { + this.Dispose(); + } + public void Dispose() { + _filters.Clear(); + } } - public class GlobalDataFilter { + public class FluentDataFilter : IDisposable { internal List<(Type type, string name, LambdaExpression exp)> _filters = new List<(Type type, string name, LambdaExpression exp)>(); - public GlobalDataFilter Apply(string filterName, Expression> filterAndValidateExp) where TEntity : class { + public FluentDataFilter Apply(string filterName, Expression> filterAndValidateExp) where TEntity : class { if (filterName == null) throw new ArgumentNullException(nameof(filterName)); if (filterAndValidateExp == null) return this; @@ -135,5 +142,12 @@ namespace FreeSql { _filters.Add((typeof(TEntity), filterName, filterAndValidateExp)); return this; } + + ~FluentDataFilter() { + this.Dispose(); + } + public void Dispose() { + _filters.Clear(); + } } } diff --git a/FreeSql.Repository/Extenssions/AutofacExtenssions.cs b/FreeSql.Repository/Extenssions/AutofacExtenssions.cs index 6a079902..c31c62f6 100644 --- a/FreeSql.Repository/Extenssions/AutofacExtenssions.cs +++ b/FreeSql.Repository/Extenssions/AutofacExtenssions.cs @@ -9,60 +9,18 @@ using System.Linq; public static class FreeSqlRepositoryAutofacExtenssions { - public static void RegisterFreeRepository(this ContainerBuilder builder, Action globalDataFilter) => RegisterFreeRepositoryPrivate(builder, globalDataFilter); + /// + /// 注册 FreeSql.Repository 包括 泛型、继承实现的仓储 + /// + /// + /// 全局过滤设置 + /// 继承实现的仓储,所在的程序集 + public static void RegisterFreeRepository(this ContainerBuilder builder, Action globalDataFilter = null, params Assembly[] assemblies) => + RegisterFreeRepositoryPrivate(builder, globalDataFilter, assemblies); - static ConcurrentDictionary _dicRegisterFreeRepositoryPrivateSetFilterFunc = new ConcurrentDictionary(); - static ConcurrentDictionary> _dicRegisterFreeRepositoryPrivateConvertFilterNotExists = new ConcurrentDictionary>(); - static void RegisterFreeRepositoryPrivate(ContainerBuilder builder, Action globalDataFilter) { + static void RegisterFreeRepositoryPrivate(ContainerBuilder builder, Action globalDataFilter, params Assembly[] assemblies) { - Action funcSetDataFilter = instance => { - if (globalDataFilter == null) return; - var globalFilter = new GlobalDataFilter(); - globalDataFilter(globalFilter); - - var type = instance.GetType(); - var entityType = type.GenericTypeArguments[0]; - - var notExists = _dicRegisterFreeRepositoryPrivateConvertFilterNotExists.GetOrAdd(type, t => new ConcurrentDictionary()); - var newFilter = new Dictionary(); - foreach (var gf in globalFilter._filters) { - if (notExists.ContainsKey(gf.name)) continue; - - LambdaExpression newExp = null; - var filterParameter1 = Expression.Parameter(entityType, gf.exp.Parameters[0].Name); - try { - newExp = Expression.Lambda( - typeof(Func<,>).MakeGenericType(entityType, typeof(bool)), - new ReplaceVisitor().Modify(gf.exp.Body, filterParameter1), - filterParameter1 - ); - } catch { - notExists.TryAdd(gf.name, true); //防止第二次错误 - continue; - } - newFilter.Add(gf.name, gf.exp); - } - if (newFilter.Any() == false) return; - - var del = _dicRegisterFreeRepositoryPrivateSetFilterFunc.GetOrAdd(type, t => { - var reposParameter = Expression.Parameter(type); - var nameParameter = Expression.Parameter(typeof(string)); - var expressionParameter = Expression.Parameter( - typeof(Expression<>).MakeGenericType(typeof(Func<,>).MakeGenericType(entityType, typeof(bool))) - ); - return Expression.Lambda( - Expression.Block( - Expression.Call(reposParameter, type.GetMethod("ApplyDataFilter", BindingFlags.Instance | BindingFlags.NonPublic), nameParameter, expressionParameter) - ), - new[] { - reposParameter, nameParameter, expressionParameter - } - ).Compile(); - }); - foreach (var nf in newFilter) { - del.DynamicInvoke(instance, nf.Key, nf.Value); - } - }; + Utils._globalDataFilter = globalDataFilter; builder.RegisterGeneric(typeof(GuidRepository<>)).As( typeof(GuidRepository<>), @@ -70,31 +28,21 @@ public static class FreeSqlRepositoryAutofacExtenssions { typeof(IBasicRepository<>), typeof(IReadOnlyRepository<>) ).OnActivating(a => { - funcSetDataFilter(a.Instance); + //Utils.SetRepositoryDataFilter(a.Instance); }).InstancePerDependency(); - + builder.RegisterGeneric(typeof(DefaultRepository<,>)).As( typeof(DefaultRepository<,>), typeof(BaseRepository<,>), typeof(IBasicRepository<,>), typeof(IReadOnlyRepository<,>) ).OnActivating(a => { - funcSetDataFilter(a.Instance); + //Utils.SetRepositoryDataFilter(a.Instance); }).InstancePerDependency(); - } - class ReplaceVisitor : ExpressionVisitor { - private ParameterExpression parameter; + builder.RegisterAssemblyTypes(assemblies).Where(a => { + return typeof(IRepository).IsAssignableFrom(a); + }).InstancePerDependency(); - public Expression Modify(Expression expression, ParameterExpression parameter) { - this.parameter = parameter; - return Visit(expression); - } - - protected override Expression VisitMember(MemberExpression node) { - if (node.Expression?.NodeType == ExpressionType.Parameter) - return Expression.Property(parameter, node.Member.Name); - return base.VisitMember(node); - } } } diff --git a/FreeSql.Repository/Extenssions/IFreeSqlExtenssions.cs b/FreeSql.Repository/Extenssions/IFreeSqlExtenssions.cs index 5b049e93..7376e413 100644 --- a/FreeSql.Repository/Extenssions/IFreeSqlExtenssions.cs +++ b/FreeSql.Repository/Extenssions/IFreeSqlExtenssions.cs @@ -18,16 +18,8 @@ public static class FreeSqlRepositoryIFreeSqlExtenssions { /// 数据过滤 + 验证 /// public static DefaultRepository GetRepository(this IFreeSql that, Expression> filter = null) where TEntity : class { - - if (filter != null) return new DefaultRepository(that, filter); - return dicGetRepository - .GetOrAdd(typeof(TEntity), key1 => new ConcurrentDictionary()) - .GetOrAdd(typeof(TKey), key2 => new DefaultRepository(that, null)) as DefaultRepository; + return new DefaultRepository(that, filter); } - static ConcurrentDictionary - > dicGetRepository = new ConcurrentDictionary>(); /// /// 返回仓库类,适用 Insert 方法无须返回插入的数据 @@ -38,12 +30,8 @@ public static class FreeSqlRepositoryIFreeSqlExtenssions { /// 分表规则,参数:旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository /// public static GuidRepository GetGuidRepository(this IFreeSql that, Expression> filter = null, Func asTable = null) where TEntity : class { - - if (filter != null || asTable != null) return new GuidRepository(that, filter, asTable); - return dicGetGuidRepository - .GetOrAdd(typeof(TEntity), key1 => new GuidRepository(that, null, null)) as GuidRepository; + return new GuidRepository(that, filter, asTable); } - static ConcurrentDictionary dicGetGuidRepository = new ConcurrentDictionary(); /// /// 合并两个仓储的设置(过滤+分表),以便查询 @@ -58,4 +46,13 @@ public static class FreeSqlRepositoryIFreeSqlExtenssions { foreach (var filter in filters) that.Where(filter.Value.Expression); return that.AsTable(repos.AsTableSelectInternal); } + + /// + /// 创建一个新的工作单元,务必使用 using 包含使用 + /// + /// + /// + public static IUnitOfWork CreateUnitOfWork(this IFreeSql that) { + return new UnitOfWork(that); + } } \ No newline at end of file diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index df8463e1..c8252ac2 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.3.15 + 0.3.16 YeXiangQin FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite, and read/write separation、and split table. https://github.com/2881099/FreeSql/wiki/Repository diff --git a/FreeSql.Repository/BaseRepository.cs b/FreeSql.Repository/Repository/BaseRepository.cs similarity index 93% rename from FreeSql.Repository/BaseRepository.cs rename to FreeSql.Repository/Repository/BaseRepository.cs index f98a57bd..49d92a33 100644 --- a/FreeSql.Repository/BaseRepository.cs +++ b/FreeSql.Repository/Repository/BaseRepository.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data.Common; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; @@ -9,6 +10,7 @@ namespace FreeSql { where TEntity : class { protected IFreeSql _fsql; + internal DbTransaction _tran; public IDataFilter DataFilter { get; } = new DataFilter(); Func _asTableVal; @@ -22,10 +24,11 @@ namespace FreeSql { protected Func AsTableSelect { get; private set; } internal Func AsTableSelectInternal => AsTableSelect; - protected Type EntityType { get; } = typeof(TEntity); + public Type EntityType { get; } = typeof(TEntity); protected BaseRepository(IFreeSql fsql, Expression> filter, Func asTable = null) : base() { _fsql = fsql ?? throw new NullReferenceException(nameof(fsql)); + Utils.SetRepositoryDataFilter(this, null); DataFilter.Apply("", filter); AsTable = asTable; } @@ -91,14 +94,14 @@ namespace FreeSql { public Task UpdateAsync(TEntity entity) => OrmUpdate(entity).ExecuteAffrowsAsync(); protected ISelect OrmSelect(object dywhere) { - var select = _fsql.Select(dywhere); + var select = _fsql.Select(dywhere).WithTransaction(_tran); var filters = (DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); foreach (var filter in filters) select.Where(filter.Value.Expression); return select.AsTable(AsTableSelect); } protected IUpdate OrmUpdate(object dywhere) { var entityObj = dywhere as TEntity; - var update = _fsql.Update(dywhere); + var update = _fsql.Update(dywhere).WithTransaction(_tran); var filters = (DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); foreach (var filter in filters) { if (entityObj != null && filter.Value.ExpressionDelegate?.Invoke(entityObj) == false) @@ -108,14 +111,14 @@ namespace FreeSql { return update.AsTable(AsTable); } protected IDelete OrmDelete(object dywhere) { - var delete = _fsql.Delete(dywhere); + var delete = _fsql.Delete(dywhere).WithTransaction(_tran); var filters = (DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); foreach (var filter in filters) delete.Where(filter.Value.Expression); return delete.AsTable(AsTable); } protected IInsert OrmInsert(TEntity entity) => OrmInsert(new[] { entity }); protected IInsert OrmInsert(IEnumerable entitys) { - var insert = _fsql.Insert(entitys); + var insert = _fsql.Insert(entitys).WithTransaction(_tran); var filters = (DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); foreach (var filter in filters) { foreach (var entity in entitys) diff --git a/FreeSql.Repository/DefaultRepository.cs b/FreeSql.Repository/Repository/DefaultRepository.cs similarity index 100% rename from FreeSql.Repository/DefaultRepository.cs rename to FreeSql.Repository/Repository/DefaultRepository.cs diff --git a/FreeSql.Repository/GuidRepository.cs b/FreeSql.Repository/Repository/GuidRepository.cs similarity index 100% rename from FreeSql.Repository/GuidRepository.cs rename to FreeSql.Repository/Repository/GuidRepository.cs diff --git a/FreeSql.Repository/IBasicRepository.cs b/FreeSql.Repository/Repository/IBasicRepository.cs similarity index 100% rename from FreeSql.Repository/IBasicRepository.cs rename to FreeSql.Repository/Repository/IBasicRepository.cs diff --git a/FreeSql.Repository/IReadOnlyRepository.cs b/FreeSql.Repository/Repository/IReadOnlyRepository.cs similarity index 100% rename from FreeSql.Repository/IReadOnlyRepository.cs rename to FreeSql.Repository/Repository/IReadOnlyRepository.cs diff --git a/FreeSql.Repository/IRepository.cs b/FreeSql.Repository/Repository/IRepository.cs similarity index 95% rename from FreeSql.Repository/IRepository.cs rename to FreeSql.Repository/Repository/IRepository.cs index a5505b88..d81c2080 100644 --- a/FreeSql.Repository/IRepository.cs +++ b/FreeSql.Repository/Repository/IRepository.cs @@ -5,7 +5,7 @@ using System.Threading.Tasks; namespace FreeSql { public interface IRepository { - + Type EntityType { get; } } public interface IRepository : IReadOnlyRepository, IBasicRepository diff --git a/FreeSql.Repository/UnitOfWork/IUnitOfWork.cs b/FreeSql.Repository/UnitOfWork/IUnitOfWork.cs new file mode 100644 index 00000000..5d8ed73a --- /dev/null +++ b/FreeSql.Repository/UnitOfWork/IUnitOfWork.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Text; + +namespace FreeSql { + public interface IUnitOfWork : IDisposable { + + /// + /// 在工作单元内创建默认仓库类,工作单元下的仓储操作具有事务特点 + /// + /// + /// + /// 数据过滤 + 验证 + /// + DefaultRepository GetRepository(Expression> filter = null) where TEntity : class; + + /// + /// 在工作单元内创建仓库类,适用 Insert 方法无须返回插入的数据,工作单元下的仓储操作具有事务特点 + /// + /// + /// 数据过滤 + 验证 + /// 分表规则,参数:旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository + /// + GuidRepository GetGuidRepository(Expression> filter = null, Func asTable = null) where TEntity : class; + + void Commit(); + + void Rollback(); + } +} diff --git a/FreeSql.Repository/UnitOfWork/UnitOfWork.cs b/FreeSql.Repository/UnitOfWork/UnitOfWork.cs new file mode 100644 index 00000000..0bca9986 --- /dev/null +++ b/FreeSql.Repository/UnitOfWork/UnitOfWork.cs @@ -0,0 +1,70 @@ +using SafeObjectPool; +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq.Expressions; +using System.Text; + +namespace FreeSql { + class UnitOfWork : IUnitOfWork { + + IFreeSql _fsql; + Object _conn; + DbTransaction _tran; + + bool _isCommitOrRoolback = false; + + public UnitOfWork(IFreeSql fsql) { + _fsql = fsql; + } + + DbTransaction BeginTransaction() { + _conn = _fsql.Ado.MasterPool.Get(); + try { + _tran = _conn.Value.BeginTransaction(); + } catch { + _fsql.Ado.MasterPool.Return(_conn); + _conn = null; + throw; + } + return _tran; + } + + public void Commit() { + _isCommitOrRoolback = true; + if (_conn != null) { + try { + _tran.Commit(); + } finally { + _fsql.Ado.MasterPool.Return(_conn); + } + } + } + public void Rollback() { + _isCommitOrRoolback = true; + if (_conn != null) { + try { + _tran.Rollback(); + } finally { + _fsql.Ado.MasterPool.Return(_conn); + } + } + } + public void Dispose() { + if (_isCommitOrRoolback == false) { + this.Commit(); + } + } + + public DefaultRepository GetRepository(Expression> filter = null) where TEntity : class { + var repos = new DefaultRepository(_fsql, filter); + repos._tran = BeginTransaction(); + return repos; + } + public GuidRepository GetGuidRepository(Expression> filter = null, Func asTable = null) where TEntity : class { + var repos = new GuidRepository(_fsql, filter, asTable); + repos._tran = BeginTransaction(); + return repos; + } + } +} diff --git a/FreeSql.Repository/Utils.cs b/FreeSql.Repository/Utils.cs new file mode 100644 index 00000000..c7d3b32e --- /dev/null +++ b/FreeSql.Repository/Utils.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Text; + +namespace FreeSql { + + internal class Utils { + + internal static Action _globalDataFilter; + + static ConcurrentDictionary _dicSetRepositoryDataFilterApplyDataFilterFunc = new ConcurrentDictionary(); + static ConcurrentDictionary> _dicSetRepositoryDataFilterConvertFilterNotExists = new ConcurrentDictionary>(); + internal static void SetRepositoryDataFilter(object repos, Action scopedDataFilter) { + if (scopedDataFilter != null) { + SetRepositoryDataFilter(repos, null); + } + if (scopedDataFilter == null) { + scopedDataFilter = _globalDataFilter; + } + if (scopedDataFilter == null) return; + using (var globalFilter = new FluentDataFilter()) { + scopedDataFilter(globalFilter); + + var type = repos.GetType(); + Type entityType = (repos as IRepository).EntityType; + if (entityType == null) throw new Exception("FreeSql.Repository 设置过滤器失败,原因是对象不属于 IRepository"); + + var notExists = _dicSetRepositoryDataFilterConvertFilterNotExists.GetOrAdd(type, t => new ConcurrentDictionary()); + var newFilter = new Dictionary(); + foreach (var gf in globalFilter._filters) { + if (notExists.ContainsKey(gf.name)) continue; + + LambdaExpression newExp = null; + var filterParameter1 = Expression.Parameter(entityType, gf.exp.Parameters[0].Name); + try { + newExp = Expression.Lambda( + typeof(Func<,>).MakeGenericType(entityType, typeof(bool)), + new ReplaceVisitor().Modify(gf.exp.Body, filterParameter1), + filterParameter1 + ); + } catch { + notExists.TryAdd(gf.name, true); //防止第二次错误 + continue; + } + newFilter.Add(gf.name, gf.exp); + } + if (newFilter.Any() == false) return; + + var del = _dicSetRepositoryDataFilterApplyDataFilterFunc.GetOrAdd(type, t => { + var reposParameter = Expression.Parameter(type); + var nameParameter = Expression.Parameter(typeof(string)); + var expressionParameter = Expression.Parameter( + typeof(Expression<>).MakeGenericType(typeof(Func<,>).MakeGenericType(entityType, typeof(bool))) + ); + return Expression.Lambda( + Expression.Block( + Expression.Call(reposParameter, type.GetMethod("ApplyDataFilter", BindingFlags.Instance | BindingFlags.NonPublic), nameParameter, expressionParameter) + ), + new[] { + reposParameter, nameParameter, expressionParameter + } + ).Compile(); + }); + foreach (var nf in newFilter) { + del.DynamicInvoke(repos, nf.Key, nf.Value); + } + newFilter.Clear(); + } + } + } + + class ReplaceVisitor : ExpressionVisitor { + private ParameterExpression parameter; + + public Expression Modify(Expression expression, ParameterExpression parameter) { + this.parameter = parameter; + return Visit(expression); + } + + protected override Expression VisitMember(MemberExpression node) { + if (node.Expression?.NodeType == ExpressionType.Parameter) + return Expression.Property(parameter, node.Member.Name); + return base.VisitMember(node); + } + } +} diff --git a/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs index 9168caaf..fd5fee74 100644 --- a/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs +++ b/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs @@ -41,7 +41,8 @@ namespace FreeSql.Tests.SqlServer { Assert.Equal(10, g.sqlserver.Insert().AppendData(items).ExecuteInserted().Count); //items = Enumerable.Range(0, 9989).Select(a => new Topic { Title = "newtitle" + a, CreateTime = DateTime.Now }).ToList(); - //Assert.Equal(9989, g.sqlserver.Insert(items).ExecuteAffrows()); + //; + //Assert.Equal(9989, g.sqlserver.Insert(items).NoneParameter().ExecuteAffrows()); var dt1 = select.Limit(10).ToDataTable(); var dt2 = select.Limit(10).ToDataTable("id, getdate()"); diff --git a/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs b/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs index eae53818..023796c5 100644 --- a/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs +++ b/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs @@ -94,6 +94,10 @@ namespace FreeSql.Tests.SqlServer { testFieldUShortNullable = ushort.MinValue, testFielLongNullable = long.MinValue }; + + var sqlPar = insert.AppendData(item2).ToSql(); + var sqlText = insert.AppendData(item2).NoneParameter().ToSql(); + var item3 = insert.AppendData(item2).ExecuteInserted(); var newitem2 = select.Where(a => a.Id == item2.Id).ToOne(); diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index d43b6fa9..f38b1469 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.3.15 + 0.3.16 true YeXiangQin FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite. diff --git a/FreeSql/Internal/CommonProvider/InsertProvider.cs b/FreeSql/Internal/CommonProvider/InsertProvider.cs index 397df8ca..e902fcbc 100644 --- a/FreeSql/Internal/CommonProvider/InsertProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertProvider.cs @@ -37,7 +37,7 @@ namespace FreeSql.Internal.CommonProvider { return this; } public IInsert NoneParameter() { - _noneParameter = false; + _noneParameter = true; return this; } diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 25b2a7d2..147f284e 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -40,7 +40,7 @@ namespace FreeSql.Internal.CommonProvider { return this; } public IUpdate NoneParameter() { - _noneParameter = false; + _noneParameter = true; return this; } diff --git a/FreeSql/PostgreSQL/PostgreSQLDbFirst.cs b/FreeSql/PostgreSQL/PostgreSQLDbFirst.cs index 9343ea57..42bba4f0 100644 --- a/FreeSql/PostgreSQL/PostgreSQLDbFirst.cs +++ b/FreeSql/PostgreSQL/PostgreSQLDbFirst.cs @@ -208,7 +208,7 @@ namespace FreeSql.PostgreSQL { using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) { olddatabase = conn.Value.Database; } - var dbs = database?.ToArray() ?? new[] { olddatabase }; + var dbs = database == null || database.Any() == false ? new[] { olddatabase } : database; var tables = new List(); foreach (var db in dbs) { @@ -301,7 +301,7 @@ where ns.nspname || '.' || c.relname in ({loc8})"; var max_length = int.Parse(string.Concat(row[3])); var sqlType = string.Concat(row[4]); var is_nullable = string.Concat(row[5]) == "1"; - var is_identity = string.Concat(row[6]).StartsWith(@"nextval('") && string.Concat(row[6]).EndsWith(@"_seq'::regclass)"); + var is_identity = string.Concat(row[6]).StartsWith(@"nextval('") && string.Concat(row[6]).EndsWith(@"'::regclass)"); var comment = string.Concat(row[7]); int attndims = int.Parse(string.Concat(row[8])); string typtype = string.Concat(row[9]); diff --git a/FreeSql/SqlServer/SqlServerDbFirst.cs b/FreeSql/SqlServer/SqlServerDbFirst.cs index adff4fba..9544e6ef 100644 --- a/FreeSql/SqlServer/SqlServerDbFirst.cs +++ b/FreeSql/SqlServer/SqlServerDbFirst.cs @@ -107,7 +107,7 @@ namespace FreeSql.SqlServer { using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) { olddatabase = conn.Value.Database; } - var dbs = database?.ToArray() ?? new[] { olddatabase }; + var dbs = database == null || database.Any() == false ? new[] { olddatabase } : database; var tables = new List(); foreach (var db in dbs) {