# FastORM
**Repository Path**: code2roc/FastORM
## Basic Information
- **Project Name**: FastORM
- **Description**: 基于ado.net封装的轻量ORM框架
- **Primary Language**: C#
- **License**: Not specified
- **Default Branch**: rebuild
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 12
- **Forks**: 7
- **Created**: 2018-07-26
- **Last Updated**: 2023-12-05
## Categories & Tags
**Categories**: database-dev
**Tags**: None
## README
### 在normal分支原有的基础上进行代码重构,基于原生的ado.net进行改造,不依赖于其他三方插件
**配置文件的一些配置项说明**
```
```
**实体类创建**
```
public class User:BaseEntity
{
[Key]
public string UserGuid { set; get; }
public string Name { set; get; }
public int Age { set; get; }
public string LoginName { set; get; }
public string PassWord { set; get; }
public DateTime AddDate { set; get; }
}
```
注:所有实体类都要继承自BaseEntity,都需要标注主键字段[key]的注解
**方法说明**
在程序开始运行时执行DBUtil.Init(),会对所有继承自BaseEntity的实体类进行扫描,进行对象的属性,解析数据,基于Emit的get,set动态方法进行缓存 ,DBUtil和DBRow两个操作类都支持通过TraceSQL属性变量设置来进行SQL语句的跟踪,配置参数配置FastORM_TraceOvertTimeSQL和FastORM_TraceOverTimeLimit后可以对数据库的超时操作进行全面跟踪
增
```
dbutil.Insert(user);
```
删
```
dbutil.Remove(user);
```
改
```
dbutil.Save(user);
```
查
```
User user = dbutil.FindOne("yanpeng19940119");
```
注:
1.查找默认按照主键进行查找
2.对于从数据库查找对象的更新,会基于ProxyAttribute对更改的字段进行记录,不会全字段更新
3.对于新创建的对象(从前台的Json传递的数据序列化成的对象),提供更新指定字段的方法Save(T Entity, string[] SaveColumn)
**一些复杂方法的支持说明**
计算表数量方法(用于分页)
```
Count()
```
批量插入方法
```
InsertBatch(List EntityList, int BatchSize = 500)
```
查找列表数据
```
List FindList(string SQL)
```
查找分页数据
```
List FindListPage(string SQL, int PageSize, int PageNum, string OrderBy)
```
查找联合查询数据
```
DataTable FindView(string SQL)
```
执行SQL语句
```
ExecuteSQL(string SQL)
```
查询单个对象数据
```
Object ExecuteScar(string SQL)
```
注:所有方法都提供了切换数据源的方法重载
**事物相关**
同库事物
```
string exceptionstr = string.Empty;
bool issuccess = dbutil.ExecuteTransition_SDB(delegate()
{
User user = new User();
user.UserGuid = "ceshi00992";
user.Name = "yanpeng";
user.LoginName = "15195007397";
user.PassWord = "123456";
user.Age = 26;
user.AddDate = DateTime.Now;
dbutil.Insert(user);
dbutil.ExecuteSQL("update User set Age=27");
}, out exceptionstr);
Console.WriteLine(issuccess);
```
分布式事物手动RollBack
```
string exceptionstr = string.Empty;
User user = new User();
user.UserGuid = "ceshi00992";
user.Name = "yanpeng";
user.LoginName = "15195007397";
user.PassWord = "123456";
user.Age = 26;
user.AddDate = DateTime.Now;
User user1 = dbutil.FindOne("yanpeng19940119");
var orginalage = user1.Age;
bool issuccess = dbutil.ExecuteTransition_DDB_HandleRollBack(delegate()
{
dbutil.Insert(user, "Test_ConnectionString");
user1.Age = 44;
dbutil.Save(user);
throw new Exception("111111");
}, delegate()
{
dbutil.Remove(user, "Test_ConnectionString");
user1.Age = orginalage;
dbutil.Save(user);
}, out exceptionstr);
Console.WriteLine(issuccess);
```
分布式事物自动RollBack(只支持简单的insert,update,delete 完善中。。。)
```
string exceptionstr = string.Empty;
User user = new User();
user.UserGuid = "ceshi00992";
user.Name = "yanpeng";
user.LoginName = "15195007397";
user.PassWord = "123456";
user.Age = 26;
user.AddDate = DateTime.Now;
User user1 = dbutil.FindOne("yanpeng19940119");
var orginalage = user1.Age;
bool issuccess = dbutil.ExecuteTransition_DDB_AutoRollBack(delegate()
{
dbutil.Insert(user, "Test_ConnectionString");
user1.Age = 44;
dbutil.Save(user1);
throw new Exception("111111");
}, out exceptionstr);
Console.WriteLine(issuccess);
```
注:自动分布式事物使用时,一定要执行DocFile下的sql建表脚本,并配置日志表的连接GlobalTransition_ConnectionString
**弱引用工具类的一些使用**
```
DBRow row = new DBRow("User", "UserGuid", "6cc5b098-0966-4b21-b93e-bdd25fded3ea");
row.TraceSQL = true;
row["Name"] = "122yan";
row["LoginName"] = "heheheh";
row["AddDate"] = DateTime.Now;
row.Insert();
row["Age"] = 33;
row.Update();
row.Delete();
```
弱引用类型同库事物
```
string exceptionstr = string.Empty;
bool issuccess = DBRow.ExecuteTransition_SDB(delegate(DbTransaction Transition)
{
DBRow row = new DBRow("User", "UserGuid", "6cc5b098-0966-4b21-b93e-bdd25fded3ea");
row["Name"] = "122yan";
row["LoginName"] = "heheheh";
row["AddDate"] = DateTime.Now;
row.Transition = Transition;
row.Insert();
DBRow row1 = new DBRow("User", "UserGuid", "11223344");
row1.Transition = Transition;
row1.Delete();
throw new Exception("1111");
}, out exceptionstr);
Console.WriteLine(issuccess);
```