-
Notifications
You must be signed in to change notification settings - Fork 857
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
28810
authored and
28810
committed
Jan 3, 2020
1 parent
f8e4e27
commit bdf32ea
Showing
24 changed files
with
290 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
110 changes: 110 additions & 0 deletions
110
Extensions/FreeSql.Extensions.BaseEntity/Net40/BaseEntity.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,110 @@ | ||
#if netcore | ||
#else | ||
|
||
using FreeSql; | ||
using FreeSql.DataAnnotations; | ||
using System; | ||
using System.Data; | ||
using System.Diagnostics; | ||
using System.Linq.Expressions; | ||
using System.Threading; | ||
using System.Threading.Tasks; | ||
|
||
namespace FreeSql | ||
{ | ||
/// <summary> | ||
/// 包括 CreateTime/UpdateTime/IsDeleted、CRUD 方法、以及 ID 主键定义 的实体基类 | ||
/// <para></para> | ||
/// 当 TKey 为 int/long 时,Id 主键被设为自增值主键 | ||
/// </summary> | ||
/// <typeparam name="TEntity"></typeparam> | ||
/// <typeparam name="TKey"></typeparam> | ||
[Table(DisableSyncStructure = true)] | ||
public abstract class BaseEntity<TEntity, TKey> : BaseEntity<TEntity> where TEntity : class | ||
{ | ||
static BaseEntity() | ||
{ | ||
var tkeyType = typeof(TKey)?.NullableTypeOrThis(); | ||
if (tkeyType == typeof(int) || tkeyType == typeof(long)) | ||
Orm.CodeFirst.ConfigEntity(typeof(TEntity), | ||
t => t.Property("Id").IsIdentity(true)); | ||
} | ||
|
||
/// <summary> | ||
/// 主键 | ||
/// </summary> | ||
[Column(Position = 1)] | ||
public virtual TKey Id { get; set; } | ||
|
||
/// <summary> | ||
/// 根据主键值获取数据 | ||
/// </summary> | ||
/// <param name="id"></param> | ||
/// <returns></returns> | ||
public static TEntity Find(TKey id) | ||
{ | ||
var item = Select.WhereDynamic(id).First(); | ||
(item as BaseEntity<TEntity>)?.Attach(); | ||
return item; | ||
} | ||
} | ||
|
||
/// <summary> | ||
/// 包括 CreateTime/UpdateTime/IsDeleted、以及 CRUD 异步和同步方法的实体基类 | ||
/// </summary> | ||
/// <typeparam name="TEntity"></typeparam> | ||
[Table(DisableSyncStructure = true)] | ||
public abstract class BaseEntity<TEntity> : BaseEntityReadOnly<TEntity> where TEntity : class | ||
{ | ||
bool DeletedPrivate(bool value) | ||
{ | ||
if (this.Repository == null) | ||
return Orm.Delete<TEntity>(this as TEntity) | ||
.ExecuteAffrows() == 1; | ||
|
||
return this.Repository.Delete(this as TEntity) == 1; | ||
} | ||
/// <summary> | ||
/// 删除数据 | ||
/// </summary> | ||
/// <returns></returns> | ||
public virtual bool Delete() => this.DeletedPrivate(true); | ||
|
||
/// <summary> | ||
/// 更新数据 | ||
/// </summary> | ||
/// <returns></returns> | ||
public virtual bool Update() | ||
{ | ||
if (this.Repository == null) | ||
return Orm.Update<TEntity>() | ||
.SetSource(this as TEntity).ExecuteAffrows() == 1; | ||
|
||
return this.Repository.Update(this as TEntity) == 1; | ||
} | ||
/// <summary> | ||
/// 插入数据 | ||
/// </summary> | ||
public virtual TEntity Insert() | ||
{ | ||
if (this.Repository == null) | ||
this.Repository = Orm.GetRepository<TEntity>(); | ||
|
||
return this.Repository.Insert(this as TEntity); | ||
} | ||
|
||
/// <summary> | ||
/// 更新或插入 | ||
/// </summary> | ||
/// <returns></returns> | ||
public virtual TEntity Save() | ||
{ | ||
if (this.Repository == null) | ||
this.Repository = Orm.GetRepository<TEntity>(); | ||
|
||
return this.Repository.InsertOrUpdate(this as TEntity); | ||
} | ||
} | ||
} | ||
|
||
#endif |
130 changes: 130 additions & 0 deletions
130
Extensions/FreeSql.Extensions.BaseEntity/Net40/BaseEntityReadOnly.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
#if netcore | ||
#else | ||
|
||
using FreeSql.DataAnnotations; | ||
using System; | ||
using System.Collections; | ||
using System.Collections.Generic; | ||
using System.Data; | ||
using System.Diagnostics; | ||
using System.Linq; | ||
using System.Linq.Expressions; | ||
using System.Threading; | ||
|
||
namespace FreeSql | ||
{ | ||
/// <summary> | ||
/// 包括 CreateTime/UpdateTime/IsDeleted 的实体基类 | ||
/// </summary> | ||
[Table(DisableSyncStructure = true)] | ||
public abstract class BaseEntity | ||
{ | ||
static IFreeSql _ormPriv; | ||
/// <summary> | ||
/// 全局 IFreeSql orm 对象 | ||
/// </summary> | ||
public static IFreeSql Orm => _ormPriv ?? throw new Exception(@"使用前请初始化 BaseEntity.Initialization(new FreeSqlBuilder() | ||
.UseAutoSyncStructure(true) | ||
.UseConnectionString(DataType.Sqlite, ""data source=test.db;max pool size=5"") | ||
.Build());"); | ||
|
||
/// <summary> | ||
/// 初始化BaseEntity | ||
/// BaseEntity.Initialization(new FreeSqlBuilder() | ||
/// <para></para> | ||
/// .UseAutoSyncStructure(true) | ||
/// <para></para> | ||
/// .UseConnectionString(DataType.Sqlite, "data source=test.db;max pool size=5") | ||
/// <para></para> | ||
/// .Build()); | ||
/// </summary> | ||
/// <param name="fsql">IFreeSql orm 对象</param> | ||
public static void Initialization(IFreeSql fsql) | ||
{ | ||
_ormPriv = fsql; | ||
_ormPriv.Aop.CurdBefore += (s, e) => Trace.WriteLine(e.Sql + "\r\n"); | ||
} | ||
} | ||
|
||
public abstract class BaseEntityReadOnly<TEntity> : BaseEntity where TEntity : class | ||
{ | ||
/// <summary> | ||
/// 查询数据 | ||
/// </summary> | ||
/// <returns></returns> | ||
public static ISelect<TEntity> Select | ||
{ | ||
get | ||
{ | ||
var select = Orm.Select<TEntity>().TrackToList(TrackToList); //自动为每个元素 Attach; | ||
return select; | ||
} | ||
} | ||
|
||
static void TrackToList(object list) | ||
{ | ||
if (list == null) return; | ||
var ls = list as IList<TEntity>; | ||
if (ls == null) | ||
{ | ||
var ie = list as IEnumerable; | ||
if (ie == null) return; | ||
var isFirst = true; | ||
foreach (var item in ie) | ||
{ | ||
if (item == null) return; | ||
if (isFirst) | ||
{ | ||
isFirst = false; | ||
var itemType = item.GetType(); | ||
if (itemType == typeof(object)) return; | ||
if (itemType.FullName.StartsWith("Submission#")) itemType = itemType.BaseType; | ||
if (Orm.CodeFirst.GetTableByEntity(itemType)?.Primarys.Any() != true) return; | ||
if (item is BaseEntity<TEntity> == false) return; | ||
} | ||
(item as BaseEntity<TEntity>)?.Attach(); | ||
} | ||
return; | ||
} | ||
if (ls.Any() == false) return; | ||
if (ls.FirstOrDefault() is BaseEntity<TEntity> == false) return; | ||
if (Orm.CodeFirst.GetTableByEntity(typeof(TEntity))?.Primarys.Any() != true) return; | ||
foreach (var item in ls) | ||
(item as BaseEntity<TEntity>)?.Attach(); | ||
} | ||
|
||
/// <summary> | ||
/// 查询条件,Where(a => a.Id > 10),支持导航对象查询,Where(a => a.Author.Email == "[email protected]") | ||
/// </summary> | ||
/// <param name="exp">lambda表达式</param> | ||
/// <returns></returns> | ||
public static ISelect<TEntity> Where(Expression<Func<TEntity, bool>> exp) => Select.Where(exp); | ||
/// <summary> | ||
/// 查询条件,Where(true, a => a.Id > 10),支导航对象查询,Where(true, a => a.Author.Email == "[email protected]") | ||
/// </summary> | ||
/// <param name="condition">true 时生效</param> | ||
/// <param name="exp">lambda表达式</param> | ||
/// <returns></returns> | ||
public static ISelect<TEntity> WhereIf(bool condition, Expression<Func<TEntity, bool>> exp) => Select.WhereIf(condition, exp); | ||
|
||
/// <summary> | ||
/// 仓储对象 | ||
/// </summary> | ||
protected IBaseRepository<TEntity> Repository { get; set; } | ||
|
||
/// <summary> | ||
/// 附加实体,在更新数据时,只更新变化的部分 | ||
/// </summary> | ||
public TEntity Attach() | ||
{ | ||
if (this.Repository == null) | ||
this.Repository = Orm.GetRepository<TEntity>(); | ||
|
||
var item = this as TEntity; | ||
this.Repository.Attach(item); | ||
return item; | ||
} | ||
} | ||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Oops, something went wrong.