diff --git a/FreeSql.DbContext/DbContext/DbContext.cs b/FreeSql.DbContext/DbContext/DbContext.cs index 6c6867d7..e979d460 100644 --- a/FreeSql.DbContext/DbContext/DbContext.cs +++ b/FreeSql.DbContext/DbContext/DbContext.cs @@ -11,18 +11,16 @@ namespace FreeSql { internal IFreeSql _orm; - internal IFreeSql _fsql => _orm ?? throw new ArgumentNullException("请在 OnConfiguring 或 AddFreeDbContext 中配置 UseFreeSql"); - - public IFreeSql Orm => _fsql; + public IFreeSql Orm => _orm ?? throw new ArgumentNullException("请在 OnConfiguring 或 AddFreeDbContext 中配置 UseFreeSql"); protected IUnitOfWork _uowPriv; - internal IUnitOfWork _uow => _isUseUnitOfWork ? (_uowPriv ?? (_uowPriv = new UnitOfWork(_fsql))) : null; + internal IUnitOfWork _uow => _isUseUnitOfWork ? (_uowPriv ?? (_uowPriv = new UnitOfWork(Orm))) : null; internal bool _isUseUnitOfWork = true; //不使用工作单元事务 public IUnitOfWork UnitOfWork => _uow; DbContextOptions _options; - internal DbContextOptions Options + public DbContextOptions Options { get { @@ -31,19 +29,22 @@ namespace FreeSql _options = new DbContextOptions(); return _options; } + set => _options = value; } - - static ConcurrentDictionary _dicGetDbSetProps = new ConcurrentDictionary(); + protected DbContext() { var builder = new DbContextOptionsBuilder(); OnConfiguring(builder); _orm = builder._fsql; + _options = builder._options; if (_orm != null) InitPropSets(); } + protected virtual void OnConfiguring(DbContextOptionsBuilder builder) { } + static ConcurrentDictionary _dicGetDbSetProps = new ConcurrentDictionary(); internal void InitPropSets() { var props = _dicGetDbSetProps.GetOrAdd(this.GetType(), tp => @@ -60,11 +61,6 @@ namespace FreeSql } } - protected virtual void OnConfiguring(DbContextOptionsBuilder builder) - { - - } - protected Dictionary _dicSet = new Dictionary(); public DbSet Set() where TEntity : class => this.Set(typeof(TEntity)) as DbSet; public virtual IDbSet Set(Type entityType) @@ -133,15 +129,10 @@ namespace FreeSql Queue _actions = new Queue(); internal int _affrows = 0; - internal void EnqueueAction(ExecCommandInfoType actionType, IDbSet dbSet, Type stateType, object state) - { + internal void EnqueueAction(ExecCommandInfoType actionType, IDbSet dbSet, Type stateType, object state) => _actions.Enqueue(new ExecCommandInfo { actionType = actionType, dbSet = dbSet, stateType = stateType, state = state }); - } - ~DbContext() - { - this.Dispose(); - } + ~DbContext() => this.Dispose(); bool _isdisposed = false; public void Dispose() { diff --git a/FreeSql.DbContext/DbContext/DbContextOptionsBuilder.cs b/FreeSql.DbContext/DbContext/DbContextOptionsBuilder.cs index 0801cfe2..02735dff 100644 --- a/FreeSql.DbContext/DbContext/DbContextOptionsBuilder.cs +++ b/FreeSql.DbContext/DbContext/DbContextOptionsBuilder.cs @@ -6,11 +6,17 @@ namespace FreeSql { internal IFreeSql _fsql; + internal DbContextOptions _options; public DbContextOptionsBuilder UseFreeSql(IFreeSql orm) { _fsql = orm; return this; } + public DbContextOptionsBuilder UseOptions(DbContextOptions options) + { + _options = options; + return this; + } } } diff --git a/FreeSql.DbContext/DbSet/DbSet.cs b/FreeSql.DbContext/DbSet/DbSet.cs index dbac00d5..59abb863 100644 --- a/FreeSql.DbContext/DbSet/DbSet.cs +++ b/FreeSql.DbContext/DbSet/DbSet.cs @@ -18,7 +18,7 @@ namespace FreeSql { _ctx = ctx; _uow = ctx._uow; - _fsql = ctx._fsql; + _fsql = ctx.Orm; } } diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs index f203537a..741f66f8 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs @@ -283,7 +283,7 @@ namespace FreeSql.Tests { [FreeSql.DataAnnotations.Column(IsPrimary = true)] - public Guid Id { get; set; } + public Guid Id { get; protected set; } public string TaskName { get; set; } public Guid TemplatesId { get; set; } public string GeneratePath { get; set; } @@ -338,9 +338,23 @@ namespace FreeSql.Tests public DateTime class2 { set; get; } } + class TestDto + { + public Guid Id { get; set; } + public bool IsLeaf { get; set; } + } + [Fact] public void Test1() { + var dkdkd = g.mysql.Select().AsTable((t,old) => "TaskBuild22") + .ToList< TestDto>(a => new TestDto() + { + Id = a.Id, + IsLeaf = g.mysql.Select().AsTable((t, old) => "TaskBuild22").Any(b => b.TemplatesId == a.Id) + }); + + var xxxkdkd = g.oracle.Select() .InnerJoin((a,b) => true) .Where((a,b) => (DateTime.Now - a.EditTime).TotalMinutes > 100) diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index a08490a0..e9b4b6fe 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -922,7 +922,12 @@ namespace FreeSql.Internal var pp = expStack.Pop() as ParameterExpression; var memberExp = expStack.Pop() as MemberExpression; var tb = _common.GetTableByEntity(pp.Type); - if (tb.ColumnsByCs.ContainsKey(memberExp.Member.Name) == false) throw new ArgumentException($"{tb.DbName} 找不到列 {memberExp.Member.Name}"); + if (tb.ColumnsByCs.ContainsKey(memberExp.Member.Name) == false) + { + if (tb.ColumnsByCsIgnore.ContainsKey(memberExp.Member.Name)) + throw new ArgumentException($"{tb.DbName}.{memberExp.Member.Name} 被忽略,请检查 IsIgnore 设置,确认 get/set 为 public"); + throw new ArgumentException($"{tb.DbName} 找不到列 {memberExp.Member.Name}"); + } if (tsc._selectColumnMap != null) { tsc._selectColumnMap.Add(new SelectColumnInfo { Table = null, Column = tb.ColumnsByCs[memberExp.Member.Name] }); @@ -1079,6 +1084,8 @@ namespace FreeSql.Internal if (tb3.Columns.Any()) return ""; } } + if (tb2.ColumnsByCsIgnore.ContainsKey(mp2.Member.Name)) + throw new ArgumentException($"{tb2.DbName}.{mp2.Member.Name} 被忽略,请检查 IsIgnore 设置,确认 get/set 为 public"); throw new ArgumentException($"{tb2.DbName} 找不到列 {mp2.Member.Name}"); } var col2 = tb2.ColumnsByCs[mp2.Member.Name];