diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/AggregateRootRepository/AggregateRootRepositoryAsync.cs b/Extensions/FreeSql.Extensions.AggregateRoot/AggregateRootRepository/AggregateRootRepositoryAsync.cs index 2a2026fe..3b8ead77 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/AggregateRootRepository/AggregateRootRepositoryAsync.cs +++ b/Extensions/FreeSql.Extensions.AggregateRoot/AggregateRootRepository/AggregateRootRepositoryAsync.cs @@ -225,17 +225,6 @@ namespace FreeSql return affrows; } - async public virtual Task SaveManyAsync(TEntity entity, string propertyName, CancellationToken cancellationToken = default) - { - var tracking = new AggregateRootTrackingChangeInfo(); - var stateKey = Orm.GetEntityKeyString(EntityType, entity, false); - if (_states.TryGetValue(stateKey, out var state) == false) throw new Exception($"AggregateRootRepository 使用仓储对象查询后,才可以保存数据 {Orm.GetEntityString(EntityType, entity)}"); - AggregateRootUtils.CompareEntityValue(_boundaryName, Orm, EntityType, state.Value, entity, propertyName, tracking); - await SaveTrackingChangeAsync(tracking, cancellationToken); - Attach(entity); //应该只存储 propertyName 内容 - } - - async Task SaveTrackingChangeAsync(AggregateRootTrackingChangeInfo tracking, CancellationToken cancellationToken) { var affrows = 0; diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/AggregateRootRepository/AggregateRootRepositorySync.cs b/Extensions/FreeSql.Extensions.AggregateRoot/AggregateRootRepository/AggregateRootRepositorySync.cs index 5bd55153..cc511cf7 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/AggregateRootRepository/AggregateRootRepositorySync.cs +++ b/Extensions/FreeSql.Extensions.AggregateRoot/AggregateRootRepository/AggregateRootRepositorySync.cs @@ -277,17 +277,6 @@ namespace FreeSql return affrows; } - public virtual void SaveMany(TEntity entity, string propertyName) - { - var tracking = new AggregateRootTrackingChangeInfo(); - var stateKey = Orm.GetEntityKeyString(EntityType, entity, false); - if (_states.TryGetValue(stateKey, out var state) == false) throw new Exception($"AggregateRootRepository 使用仓储对象查询后,才可以保存数据 {Orm.GetEntityString(EntityType, entity)}"); - AggregateRootUtils.CompareEntityValue(_boundaryName, Orm, EntityType, state.Value, entity, propertyName, tracking); - SaveTrackingChange(tracking); - Attach(entity); //应该只存储 propertyName 内容 - } - - int SaveTrackingChange(AggregateRootTrackingChangeInfo tracking) { var affrows = 0; diff --git a/FreeSql.DbContext/DbContext/DbContext.cs b/FreeSql.DbContext/DbContext/DbContext.cs index 03323796..adeccc30 100644 --- a/FreeSql.DbContext/DbContext/DbContext.cs +++ b/FreeSql.DbContext/DbContext/DbContext.cs @@ -183,20 +183,6 @@ namespace FreeSql CheckEntityTypeOrThrow(typeof(TEntity)); this.Set().AddOrUpdate(data); } - /// - /// 保存实体的指定 ManyToMany/OneToMany 导航属性(完整对比) - /// 场景:在关闭级联保存功能之后,手工使用本方法 - /// 例子:保存商品的 OneToMany 集合属性,SaveMany(goods, "Skus") - /// 当 goods.Skus 为空(非null)时,会删除表中已存在的所有数据 - /// 当 goods.Skus 不为空(非null)时,添加/更新后,删除表中不存在 Skus 集合属性的所有记录 - /// - /// 实体对象 - /// 属性名 - public void SaveMany(TEntity data, string propertyName) where TEntity : class - { - CheckEntityTypeOrThrow(typeof(TEntity)); - this.Set().SaveMany(data, propertyName); - } /// /// 附加实体,可用于不查询就更新或删除 @@ -253,11 +239,6 @@ namespace FreeSql CheckEntityTypeOrThrow(typeof(TEntity)); return this.Set().AddOrUpdateAsync(data, cancellationToken); } - public Task SaveManyAsync(TEntity data, string propertyName, CancellationToken cancellationToken = default) where TEntity : class - { - CheckEntityTypeOrThrow(typeof(TEntity)); - return this.Set().SaveManyAsync(data, propertyName, cancellationToken); - } #endif #endregion diff --git a/FreeSql.DbContext/DbContext/DbContextOptions.cs b/FreeSql.DbContext/DbContext/DbContextOptions.cs index 8401b46f..7413424f 100644 --- a/FreeSql.DbContext/DbContext/DbContextOptions.cs +++ b/FreeSql.DbContext/DbContext/DbContextOptions.cs @@ -24,16 +24,6 @@ namespace FreeSql /// public bool EnableCascadeSave { get; set; } = false; - /// - /// 因增加支持 OneToOne 级联保存,和基于内存的级联删除,已改名为 EnableCascadeSave - /// - [Obsolete("因增加支持 OneToOne 级联保存,和基于内存的级联删除,已改名为 EnableCascadeSave")] - public bool EnableAddOrUpdateNavigateList - { - get => EnableCascadeSave; - set => EnableCascadeSave = value; - } - /// /// 使用无参数化设置(对应 IInsert/IUpdate) /// diff --git a/FreeSql.DbContext/DbSet/DbSetAsync.cs b/FreeSql.DbContext/DbSet/DbSetAsync.cs index 4238f159..f9a9534a 100644 --- a/FreeSql.DbContext/DbSet/DbSetAsync.cs +++ b/FreeSql.DbContext/DbSet/DbSetAsync.cs @@ -149,64 +149,6 @@ namespace FreeSql await AddOrUpdateNavigateAsync(item, true, null, cancellationToken); } - async public Task SaveManyAsync(TEntity item, string propertyName, CancellationToken cancellationToken = default) - { - if (item == null) return; - if (string.IsNullOrEmpty(propertyName)) return; - if (_table.Properties.TryGetValue(propertyName, out var prop) == false) throw new KeyNotFoundException(DbContextStrings.NotFound_Property(_table.Type.FullName, propertyName)); - if (_table.ColumnsByCsIgnore.ContainsKey(propertyName)) throw new ArgumentException(DbContextStrings.TypeHasSetProperty_IgnoreAttribute(_table.Type.FullName, propertyName)); - - var tref = _table.GetTableRef(propertyName, true, false); - if (tref == null) return; - switch (tref.RefType) - { - case TableRefType.OneToOne: - case TableRefType.ManyToOne: - case TableRefType.PgArrayToMany: - throw new ArgumentException(DbContextStrings.PropertyOfType_IsNot_OneToManyOrManyToMany(_table.Type.FullName, propertyName)); - } - - await DbContextFlushCommandAsync(cancellationToken); - var oldEnable = _db.Options.EnableCascadeSave; - _db.Options.EnableCascadeSave = false; - try - { - await AddOrUpdateNavigateAsync(item, false, propertyName, cancellationToken); - if (tref.RefType == TableRefType.OneToMany) - { - await DbContextFlushCommandAsync(cancellationToken); - //删除没有保存的数据,求出主体的条件 - var deleteWhereParentParam = Expression.Parameter(typeof(object), "a"); - Expression whereParentExp = null; - for (var colidx = 0; colidx < tref.Columns.Count; colidx++) - { - var whereExp = Expression.Equal( - Expression.MakeMemberAccess(Expression.Convert(deleteWhereParentParam, tref.RefEntityType), tref.RefColumns[colidx].Table.Properties[tref.RefColumns[colidx].CsName]), - Expression.Constant( - FreeSql.Internal.Utils.GetDataReaderValue( - tref.Columns[colidx].CsType, - _db.OrmOriginal.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName)), tref.RefColumns[colidx].CsType) - ); - if (whereParentExp == null) whereParentExp = whereExp; - else whereParentExp = Expression.AndAlso(whereParentExp, whereExp); - } - var propValEach = GetItemValue(item, prop) as IEnumerable; - var subDelete = _db.OrmOriginal.Delete().AsType(tref.RefEntityType) - .WithTransaction(_uow?.GetOrBeginTransaction()) - .Where(Expression.Lambda>(whereParentExp, deleteWhereParentParam)); - foreach (var propValItem in propValEach) - { - subDelete.WhereDynamic(propValEach, true); - break; - } - await subDelete.ExecuteAffrowsAsync(cancellationToken); - } - } - finally - { - _db.Options.EnableCascadeSave = oldEnable; - } - } async Task AddOrUpdateNavigateAsync(TEntity item, bool isAdd, string propertyName, CancellationToken cancellationToken) { Func action = async prop => diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index 41417a0a..ccbc1f72 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -151,73 +151,6 @@ namespace FreeSql AddOrUpdateNavigate(item, true, null); } - /// - /// 保存实体的指定 ManyToMany/OneToMany 导航属性(完整对比) - /// 场景:在关闭级联保存功能之后,手工使用本方法 - /// 例子:保存商品的 OneToMany 集合属性,SaveMany(goods, "Skus") - /// 当 goods.Skus 为空(非null)时,会删除表中已存在的所有数据 - /// 当 goods.Skus 不为空(非null)时,添加/更新后,删除表中不存在 Skus 集合属性的所有记录 - /// - /// 实体对象 - /// 属性名 - public void SaveMany(TEntity item, string propertyName) - { - if (item == null) return; - if (string.IsNullOrEmpty(propertyName)) return; - if (_table.Properties.TryGetValue(propertyName, out var prop) == false) throw new KeyNotFoundException(DbContextStrings.NotFound_Property(_table.Type.FullName, propertyName)); - if (_table.ColumnsByCsIgnore.ContainsKey(propertyName)) throw new ArgumentException(DbContextStrings.TypeHasSetProperty_IgnoreAttribute(_table.Type.FullName, propertyName)); - - var tref = _table.GetTableRef(propertyName, true, false); - if (tref == null) return; - switch (tref.RefType) - { - case TableRefType.OneToOne: - case TableRefType.ManyToOne: - case TableRefType.PgArrayToMany: - throw new ArgumentException(DbContextStrings.PropertyOfType_IsNot_OneToManyOrManyToMany(_table.Type.FullName, propertyName)); - } - - DbContextFlushCommand(); - var oldEnable = _db.Options.EnableCascadeSave; - _db.Options.EnableCascadeSave = false; - try - { - AddOrUpdateNavigate(item, false, propertyName); - if (tref.RefType == TableRefType.OneToMany) - { - DbContextFlushCommand(); - //删除没有保存的数据,求出主体的条件 - var deleteWhereParentParam = Expression.Parameter(typeof(object), "a"); - Expression whereParentExp = null; - for (var colidx = 0; colidx < tref.Columns.Count; colidx++) - { - var whereExp = Expression.Equal( - Expression.MakeMemberAccess(Expression.Convert(deleteWhereParentParam, tref.RefEntityType), tref.RefColumns[colidx].Table.Properties[tref.RefColumns[colidx].CsName]), - Expression.Constant( - FreeSql.Internal.Utils.GetDataReaderValue( - tref.Columns[colidx].CsType, - _db.OrmOriginal.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName)), tref.RefColumns[colidx].CsType) - ); - if (whereParentExp == null) whereParentExp = whereExp; - else whereParentExp = Expression.AndAlso(whereParentExp, whereExp); - } - var propValEach = GetItemValue(item, prop) as IEnumerable; - var subDelete = _db.OrmOriginal.Delete().AsType(tref.RefEntityType) - .WithTransaction(_uow?.GetOrBeginTransaction()) - .Where(Expression.Lambda>(whereParentExp, deleteWhereParentParam)); - foreach (var propValItem in propValEach) - { - subDelete.WhereDynamic(propValEach, true); - break; - } - subDelete.ExecuteAffrows(); - } - } - finally - { - _db.Options.EnableCascadeSave = oldEnable; - } - } void AddOrUpdateNavigate(TEntity item, bool isAdd, string propertyName) { Action action = prop => diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 0f686a1e..3a86a24b 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -37,17 +37,6 @@ - - - 保存实体的指定 ManyToMany/OneToMany 导航属性(完整对比) - 场景:在关闭级联保存功能之后,手工使用本方法 - 例子:保存商品的 OneToMany 集合属性,SaveMany(goods, "Skus") - 当 goods.Skus 为空(非null)时,会删除表中已存在的所有数据 - 当 goods.Skus 不为空(非null)时,添加/更新后,删除表中不存在 Skus 集合属性的所有记录 - - 实体对象 - 属性名 - 附加实体,可用于不查询就更新或删除 @@ -110,11 +99,6 @@ - 属性集合不为空时,与数据库存在的关联数据(中间表)完全对比,计算出应该删除和添加的记录 - - - 因增加支持 OneToOne 级联保存,和基于内存的级联删除,已改名为 EnableCascadeSave - - 使用无参数化设置(对应 IInsert/IUpdate) @@ -187,17 +171,6 @@ - - - 保存实体的指定 ManyToMany/OneToMany 导航属性(完整对比) - 场景:在关闭级联保存功能之后,手工使用本方法 - 例子:保存商品的 OneToMany 集合属性,SaveMany(goods, "Skus") - 当 goods.Skus 为空(非null)时,会删除表中已存在的所有数据 - 当 goods.Skus 不为空(非null)时,添加/更新后,删除表中不存在 Skus 集合属性的所有记录 - - 实体对象 - 属性名 - 更新 @@ -507,32 +480,6 @@ FreeSql.Repository Update 失败,因为设置了过滤器 {filterKey}: {filterValueExpression},更新的数据不符合{entityString} - - - 在工作单元内创建默认仓库类,工作单元下的仓储操作具有事务特点 - - - - 数据过滤 + 验证 - - - - - 在工作单元内创建联合主键的仓储类,工作单元下的仓储操作具有事务特点 - - - 数据过滤 + 验证 - - - - - 在工作单元内创建仓库类,工作单元下的仓储操作具有事务特点 - - - 数据过滤 + 验证 - 分表规则,参数:旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository - - 动态Type,在使用 Repository<object> 后使用本方法,指定实体类型 @@ -581,17 +528,6 @@ 最新的实体对象,它将与附加实体的状态对比 key: 属性名, value: [旧值, 新值] - - - 保存实体的指定 ManyToMany/OneToMany 导航属性(完整对比) - 场景:在关闭级联保存功能之后,手工使用本方法 - 例子:保存商品的 OneToMany 集合属性,SaveMany(goods, "Skus") - 当 goods.Skus 为空(非null)时,会删除表中已存在的所有数据 - 当 goods.Skus 不为空(非null)时,添加/更新后,删除表中不存在 Skus 集合属性的所有记录 - - 实体对象 - 属性名 - 根据设置的 OneToOne/OneToMany/ManyToMany 导航属性,级联查询所有的数据库记录,删除并返回它们 @@ -764,38 +700,17 @@ - - - 返回默认仓库类 - - - - - 数据过滤 + 验证 - - - + 返回默认仓库类,适用联合主键的仓储类 - 数据过滤 + 验证 - - - - - 返回仓库类 - - - - 数据过滤 + 验证 - 分表规则,参数:旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository - 创建基于仓储功能的工作单元,务必使用 using 包含使用 + 创建基于工作单元,务必使用 using 包含使用 diff --git a/FreeSql.DbContext/Repository/ContextSet/RepositoryUnitOfWork.cs b/FreeSql.DbContext/Repository/ContextSet/RepositoryUnitOfWork.cs deleted file mode 100644 index e5479d93..00000000 --- a/FreeSql.DbContext/Repository/ContextSet/RepositoryUnitOfWork.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.Linq.Expressions; - -namespace FreeSql -{ - - public interface IRepositoryUnitOfWork : IUnitOfWork - { - /// - /// 在工作单元内创建默认仓库类,工作单元下的仓储操作具有事务特点 - /// - /// - /// - /// 数据过滤 + 验证 - /// - IBaseRepository GetRepository(Expression> filter = null) where TEntity : class; - - /// - /// 在工作单元内创建联合主键的仓储类,工作单元下的仓储操作具有事务特点 - /// - /// - /// 数据过滤 + 验证 - /// - IBaseRepository GetRepository(Expression> filter = null) where TEntity : class; - - /// - /// 在工作单元内创建仓库类,工作单元下的仓储操作具有事务特点 - /// - /// - /// 数据过滤 + 验证 - /// 分表规则,参数:旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository - /// - IBaseRepository GetGuidRepository(Expression> filter = null, Func asTable = null) where TEntity : class; - } - - class RepositoryUnitOfWork : UnitOfWork, IRepositoryUnitOfWork - { - - public RepositoryUnitOfWork(IFreeSql fsql) : base(fsql) - { - } - - public IBaseRepository GetGuidRepository(Expression> filter = null, Func asTable = null) where TEntity : class - { - var repo = new GuidRepository(_fsql, filter, asTable); - repo.UnitOfWork = this; - return repo; - } - - public IBaseRepository GetRepository(Expression> filter = null) where TEntity : class - { - var repo = new DefaultRepository(_fsql, filter); - repo.UnitOfWork = this; - return repo; - } - - public IBaseRepository GetRepository(Expression> filter = null) where TEntity : class - { - var repo = new DefaultRepository(_fsql, filter); - repo.UnitOfWork = this; - return repo; - } - } -} diff --git a/FreeSql.DbContext/Repository/Extensions/FreeSqlRepositoryExtensions.cs b/FreeSql.DbContext/Repository/Extensions/FreeSqlRepositoryExtensions.cs index 9b4ed306..65344b1d 100644 --- a/FreeSql.DbContext/Repository/Extensions/FreeSqlRepositoryExtensions.cs +++ b/FreeSql.DbContext/Repository/Extensions/FreeSqlRepositoryExtensions.cs @@ -5,52 +5,24 @@ using System.Linq.Expressions; partial class FreeSqlDbContextExtensions { - - /// - /// 返回默认仓库类 - /// - /// - /// - /// - /// 数据过滤 + 验证 - /// - public static IBaseRepository GetRepository(this IFreeSql that, Expression> filter = null) where TEntity : class - { - return new DefaultRepository(that, filter); - } - /// /// 返回默认仓库类,适用联合主键的仓储类 /// /// /// - /// 数据过滤 + 验证 /// - public static IBaseRepository GetRepository(this IFreeSql that, Expression> filter = null) where TEntity : class + public static IBaseRepository GetRepository(this IFreeSql that) where TEntity : class { - return new DefaultRepository(that, filter); + return new DefaultRepository(that); } /// - /// 返回仓库类 - /// - /// - /// - /// 数据过滤 + 验证 - /// 分表规则,参数:旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository - /// - public static IBaseRepository GetGuidRepository(this IFreeSql that, Expression> filter = null, Func asTable = null) where TEntity : class - { - return new GuidRepository(that, filter, asTable); - } - - /// - /// 创建基于仓储功能的工作单元,务必使用 using 包含使用 + /// 创建基于工作单元,务必使用 using 包含使用 /// /// /// - public static IRepositoryUnitOfWork CreateUnitOfWork(this IFreeSql that) + public static IUnitOfWork CreateUnitOfWork(this IFreeSql that) { - return new RepositoryUnitOfWork(that); + return new UnitOfWork(that); } } \ No newline at end of file diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs index b5618ea7..d0ee01d5 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs @@ -19,10 +19,9 @@ namespace FreeSql internal Func _asTablePriv; - protected BaseRepository(IFreeSql fsql, Expression> filter, Func asTable = null) + protected BaseRepository(IFreeSql fsql) { _ormScoped = DbContextScopedFreeSql.Create(fsql, () => _db, () => UnitOfWork); - AsTable(asTable); } ~BaseRepository() => this.Dispose(); @@ -143,12 +142,6 @@ namespace FreeSql return entity; } - public virtual void SaveMany(TEntity entity, string propertyName) - { - _dbset.SaveMany(entity, propertyName); - _db.SaveChanges(); - } - public virtual void BeginEdit(List data) => _dbset.BeginEdit(data); public virtual int EndEdit(List data = null) { @@ -184,7 +177,7 @@ namespace FreeSql public abstract partial class BaseRepository : BaseRepository, IBaseRepository where TEntity : class { - public BaseRepository(IFreeSql fsql, Expression> filter, Func asTable = null) : base(fsql, filter, asTable) { } + public BaseRepository(IFreeSql fsql) : base(fsql) { } TEntity CheckTKeyAndReturnIdEntity(TKey id) { diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepositoryAsync.cs b/FreeSql.DbContext/Repository/Repository/BaseRepositoryAsync.cs index 5ade3e00..3612f3ec 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepositoryAsync.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepositoryAsync.cs @@ -68,12 +68,6 @@ namespace FreeSql await _db.SaveChangesAsync(cancellationToken); return entity; } - - public virtual async Task SaveManyAsync(TEntity entity, string propertyName, CancellationToken cancellationToken = default) - { - await _dbset.SaveManyAsync(entity, propertyName, cancellationToken); - await _db.SaveChangesAsync(cancellationToken); - } } partial class BaseRepository diff --git a/FreeSql.DbContext/Repository/Repository/DefaultRepository.cs b/FreeSql.DbContext/Repository/Repository/DefaultRepository.cs index 86b43806..850cdb40 100644 --- a/FreeSql.DbContext/Repository/Repository/DefaultRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/DefaultRepository.cs @@ -3,21 +3,19 @@ using System.Linq.Expressions; namespace FreeSql { - public class DefaultRepository : BaseRepository where TEntity : class + class DefaultRepository : BaseRepository where TEntity : class { - public DefaultRepository(IFreeSql fsql) : base(fsql, null, null) { } - public DefaultRepository(IFreeSql fsql, Expression> filter) : base(fsql, filter, null) { } - public DefaultRepository(IFreeSql fsql, UnitOfWorkManager uowManger) : base(uowManger?.Orm ?? fsql, null, null) + public DefaultRepository(IFreeSql fsql) : base(fsql) { } + public DefaultRepository(IFreeSql fsql, UnitOfWorkManager uowManger) : base(uowManger?.Orm ?? fsql) { uowManger?.Binding(this); } } - public class GuidRepository : BaseRepository where TEntity : class + class GuidRepository : BaseRepository where TEntity : class { - public GuidRepository(IFreeSql fsql) : this(fsql, null, null) { } - public GuidRepository(IFreeSql fsql, Expression> filter, Func asTable) : base(fsql, filter, asTable) { } - public GuidRepository(IFreeSql fsql, UnitOfWorkManager uowManger) : base(uowManger?.Orm ?? fsql, null, null) + public GuidRepository(IFreeSql fsql) : base(fsql) { } + public GuidRepository(IFreeSql fsql, UnitOfWorkManager uowManger) : base(uowManger?.Orm ?? fsql) { uowManger?.Binding(this); } diff --git a/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs b/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs index fafd783a..bd09bb41 100644 --- a/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs @@ -73,16 +73,6 @@ namespace FreeSql int Update(IEnumerable entitys); TEntity InsertOrUpdate(TEntity entity); - /// - /// 保存实体的指定 ManyToMany/OneToMany 导航属性(完整对比) - /// 场景:在关闭级联保存功能之后,手工使用本方法 - /// 例子:保存商品的 OneToMany 集合属性,SaveMany(goods, "Skus") - /// 当 goods.Skus 为空(非null)时,会删除表中已存在的所有数据 - /// 当 goods.Skus 不为空(非null)时,添加/更新后,删除表中不存在 Skus 集合属性的所有记录 - /// - /// 实体对象 - /// 属性名 - void SaveMany(TEntity entity, string propertyName); IUpdate UpdateDiy { get; } @@ -121,7 +111,6 @@ namespace FreeSql Task UpdateAsync(TEntity entity, CancellationToken cancellationToken = default); Task UpdateAsync(IEnumerable entitys, CancellationToken cancellationToken = default); Task InsertOrUpdateAsync(TEntity entity, CancellationToken cancellationToken = default); - Task SaveManyAsync(TEntity entity, string propertyName, CancellationToken cancellationToken = default); Task DeleteAsync(TEntity entity, CancellationToken cancellationToken = default); Task DeleteAsync(IEnumerable entitys, CancellationToken cancellationToken = default); diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index a7a29088..a656490c 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1104,6 +1104,93 @@ + + + 动态创建实体类型 + + + + + 配置Class + + 类名 + 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] + + + + + 获取类型构建器,可作为要构建的Type来引用 + + + + + 配置属性 + + 属性名称 + 属性类型 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性默认值 + 属性标记的特性-支持多个 + + + + + 配置父类 + + 父类类型 + + + + + Override属性 + + + + + + Emit动态创建出Class - Type + + + + + + Emit动态创建出Class - Type,不附带获取TableInfo + + + + + + 首字母小写 + + + + + + + 首字母大写 + + + + 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 "" @@ -5826,6 +5913,28 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 + + + 动态构建Class Type + + + + + + 根据字典,创建 table 对应的实体对象 + + + + + + + + 根据实体对象,创建 table 对应的字典 + + + + + C#: that >= between && that <= and