.Net 常用ORM框架对比:EF Core、FreeSql、SqlSuger

1 /// <summary>
2 /// 班级
3 /// </summary>
4 public class ClassGrade
5 {
6 [FreeSql.DataAnnotations.Column(IsIdentity = true, IsPrimary = true)]//FreeSql
7 [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]//Sugar
8 [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)] //Ef设置自增(int类型默认自增)
9 public int Id { get; set; }
10 public string Name { get; set; }
11 [SugarColumn(IsIgnore = true)]
12 public virtual ICollection<Student> Students { get; set; }
13 [SugarColumn(IsIgnore = true)]
14 public virtual ICollection<MiddleClassCourse> Classs { get; set; }//
15 }
16 /// <summary>
17 /// 课程
18 /// </summary>
19 public class Course
20 {
21 [FreeSql.DataAnnotations.Column(IsIdentity = true, IsPrimary = true)]//FreeSql
22 [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]//Sugar
23 [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] //Ef设置自增(int类型默认自增)
24 public int Id { get; set; }
25 public string Name { get; set; }
26 public virtual string Teacher { get; set; }
27 [SugarColumn(IsIgnore = true)]
28 public virtual ICollection<MiddleClassCourse> ClassStudents { get; set; }//班级学生
29 [SugarColumn(IsIgnore = true)]
30 public virtual ICollection<MiddleStudentCourse> Students { get; set; }//选修学生
31 }
32 /// <summary>
33 /// 学生
34 /// </summary>
35 public class Student
36 {
37 [FreeSql.DataAnnotations.Column(IsIdentity = true, IsPrimary = true)]//FreeSql
38 [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]//Sugar
39 [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] //Ef设置自增(int类型默认自增)
40 public int Id { get; set; }
41 public string Name { get; set; }
42 public int Age { get; set; }
43 public int Sex { get; set; }
44 public int ClassId { get; set; }
45 [SugarColumn(IsIgnore = true)]
46 public virtual ClassGrade Class { get; set; }
47 [SugarColumn(IsIgnore = true)]
48 public virtual ICollection<MiddleStudentCourse> Courses { get; set; }//辅修课、自选课
49 }
50 {
51 /// <summary>
52 /// 中间表(班级-课程)
53 /// </summary>
54 public class MiddleClassCourse
55 {
56 [FreeSql.DataAnnotations.Column(IsIdentity = true, IsPrimary = true)]//FreeSql
57 [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]//Sugar
58 [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] //Ef设置自增(int类型默认自增)
59 public int Id { get; set; }
60 public int ClassId { get; set; }
61 [SugarColumn(IsIgnore = true)]
62 public virtual ClassGrade Class { get; set; }
63 public int CourseId { get; set; }
64 [SugarColumn(IsIgnore = true)]
65 public virtual Course Course { get; set; }
66 }
67 /// <summary>
68 /// 中间表(学生-课程)
69 /// </summary>
70 public class MiddleStudentCourse
71 {
72 [FreeSql.DataAnnotations.Column(IsIdentity = true, IsPrimary = true)]//FreeSql
73 [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]//Sugar
74 [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] //Ef设置自增(int类型默认自增)
75 public int Id { get; set; }
76 public int CourseId { get; set; }
77 [SugarColumn(IsIgnore = true)]
78 public virtual Course Course { get; set; }
79 public int StudentId { get; set; }
80 [SugarColumn(IsIgnore = true)]
81 public virtual Student Student { get; set; }
82 }
public class EfDbContext : DbContext
{
/// <summary>
/// 指定静态ILoggerFactory
/// </summary>
public static readonly ILoggerFactory MyLoggerFactory = LoggerFactory.Create(builder => { builder.AddConsole(); }); public EfDbContext() { } public EfDbContext(DbContextOptions<EfDbContext> options)
: base(options)
{
} private string Conn = null;
public DbContext ToWriteOrRead(string conn)
{
Conn = conn;
return this;
} protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseLoggerFactory(MyLoggerFactory)
//.UseLazyLoadingProxies()
.UseSqlServer(Conn);
}
optionsBuilder.UseLoggerFactory(MyLoggerFactory);
} protected override void OnModelCreating(ModelBuilder modelBuilder)
{
#region MyRegion {
//指定主键
//modelBuilder.Entity<ClassGrade>().HasKey(a => a.Id);
/////设置数据库架构
//modelBuilder.HasDefaultSchema("xl");
/////表名、属性名映射
//modelBuilder.Entity<UserInfo>().ToTable("UserInfos", "Zhaoxi").Property(p => p.UserAge).HasColumnName("Age");
////设置联合主键
//modelBuilder.Entity<SysUserRoleMapping>().HasKey(p => new { p.SysUserId, p.SysRoleId });
////初始化数据
//modelBuilder.Entity<Company>().HasData(new List<Company>()
//{
//});
///////表拆分:在数据库中是一整张表,在代码层面是多个实体与其对应;
//modelBuilder.Entity<SysLog>(dob =>
//{
// dob.ToTable("SysLogInfo");
// dob.Property(o => o.LogType).HasColumnName("LogType");//配置两个实体的相同属性映射到表的同一列
// dob.HasOne(o => o.SysLogDetail).WithOne().HasForeignKey<SysLog>(o => o.Id); ; //配置两个实体的相同属性映射到表的同一列
//});
//modelBuilder.Entity<SysLogDetail>(dob =>
//{
// dob.ToTable("SysLogInfo");
// dob.Property(o => o.LogType).HasColumnName("LogType");//配置两个实体的相同属性映射到表的同一列
//});
} //设置一对多的关系
modelBuilder.Entity<Student>().HasOne(c => c.Class).WithMany(s => s.Students).HasForeignKey(b => b.ClassId); ////多对多关系
modelBuilder.Entity<MiddleStudentCourse>(eb =>
{
eb.HasOne(p => p.Course).WithMany(u => u.Students).HasForeignKey(u => u.CourseId);
eb.HasOne(p => p.Student).WithMany(r => r.Courses).HasForeignKey(s => s.StudentId);
});
modelBuilder.Entity<MiddleClassCourse>(eb => {
eb.HasOne(p => p.Course).WithMany(u => u.ClassStudents).HasForeignKey(u => u.CourseId);
eb.HasOne(p => p.Class).WithMany(r => r.Classs).HasForeignKey(s => s.ClassId);
});
#endregion
} public DbSet<ClassGrade> Classs { get; set; }
public DbSet<Student> Students { get; set; }
public DbSet<Course> Courses { get; set; }
}
public class FreeSqlContext: DbContext
{ public DbSet<Student> Students { get; set; }
public DbSet<Course> Courses { get; set; }
public DbSet<ClassGrade> ClassGrades { get; set; }
public DbSet<MiddleClassCourse> MiddleClassCourses { get; set; }
public DbSet<MiddleStudentCourse> MiddleStudentCourses { get; set; } //每个 DbContext 只触发一次
protected override void OnModelCreating(ICodeFirst codefirst)
{
codefirst.Entity<Student>(eb =>
{
eb.HasOne(a => a.Class).HasForeignKey(b => b.ClassId).WithMany(c => c.Students);
}); codefirst.Entity<MiddleStudentCourse>(eb =>
{
eb.HasOne(a => a.Student).WithMany(t => t.Courses).HasForeignKey(b => b.StudentId);
eb.HasOne(a => a.Course).WithMany(t => t.Students).HasForeignKey(a => a.CourseId);
}); codefirst.Entity<MiddleClassCourse>(eb =>
{
eb.HasOne(a => a.Course).WithMany(t => t.ClassStudents).HasForeignKey(a => a.CourseId);
eb.HasOne(a => a.Class).WithMany(t => t.Students).HasForeignKey(a => a.ClassId);
});
}
}
public class SqlSugerContext<T>: SimpleClient<T> where T : class, new()
{
public SqlSugerContext(SqlSugarClient context) : base(context)//注意这里要有默认值等于null
{
context.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(T));//这样一个表就能成功创建了
}
}
public class ClassGradeService: SqlSugerContext<ClassGrade>
{
public ClassGradeService(SqlSugarClient context):base(context)
{ }
}
public class CourseService: SqlSugerContext<Course>
{
public CourseService(SqlSugarClient context) : base(context)
{
}
}
public class StudentService: SqlSugerContext<Student>
{
public StudentService(SqlSugarClient context) : base(context)
{
}
}
public class MiddleClassCourseCervice : SqlSugerContext<MiddleClassCourse>
{
public MiddleClassCourseCervice(SqlSugarClient context) : base(context)
{ }
}
public class MiddleStudentCourseService : SqlSugerContext<MiddleStudentCourse>
{
public MiddleStudentCourseService(SqlSugarClient context) : base(context)
{ }
}
"EfConnectionStrings": {
"WriteConnection": "Server=localhost;Database=DbEfCore;Trusted_Connection=True;",
"ReadConnectionList": [
"Server=localhost;Database=DbEfCore;Trusted_Connection=True;"
]
},
"FreeSqlConnectionStrings": "Server=localhost;Database=DbFreeSql;Trusted_Connection=True;",
"SqlSugerConnectionStrings": "Server=localhost;Database=DbSqlSuger;Trusted_Connection=True;"
public enum WriteAndReadEnum
{
Write, //主库操作
Read //从库操作
}
public interface IDbContextFactory
{
public EfDbContext ConnWriteOrRead(WriteAndReadEnum writeAndRead);
}
public class DBConnectionOption
{
public string WriteConnection { get; set; }
public List<string> ReadConnectionList { get; set; }
}
public class DbContextFactory : IDbContextFactory
{
private readonly EfDbContext _Context = new EfDbContext();
private static int _iSeed = 0;
private readonly DBConnectionOption _readAndWrite = null;
public DbContextFactory(IOptionsMonitor<DBConnectionOption> options)
{
_readAndWrite = options.CurrentValue;
}
public EfDbContext ConnWriteOrRead(WriteAndReadEnum writeAndRead)
{
//判断枚举,不同的枚举可以创建不同的Context 或者更换Context链接;
switch (writeAndRead)
{
case WriteAndReadEnum.Write:
ToWrite();
break; //选择链接//更换_Context链接 //选择链接
case WriteAndReadEnum.Read:
ToRead();
break; //选择链接//更换_Context链接
default:
break;
}
return _Context;
}
/// <summary>
/// 更换成主库连接
/// </summary>
/// <returns></returns>
private void ToWrite()
{
string conn = _readAndWrite.WriteConnection;
_Context.ToWriteOrRead(conn);
}
/// <summary>
/// 更换成主库连接
///
/// ///策略---数据库查询的负载均衡
/// </summary>
/// <returns></returns>
private void ToRead()
{
var conn = this._readAndWrite.ReadConnectionList[_iSeed++ % this._readAndWrite.ReadConnectionList.Count];//轮询;
_Context.ToWriteOrRead(conn);
}
}
#region FreeSql//DbFreeSql
var freestr = Configuration.GetSection("FreeSqlConnectionStrings").Value;
IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.SqlServer, freestr)
.UseSlave(freestr)//使用从数据库,支持多个
.UseAutoSyncStructure(true) //自动同步实体结构到数据库
.Build(); //请务必定义成 Singleton 单例模式
services.AddSingleton<IFreeSql>(fsql);
services.AddFreeDbContext<FreeSqlContext>(options => options.UseFreeSql(fsql));
#endregion #region SqlSuger//DbSqlSuger
var sugerstr = Configuration.GetSection("SqlSugerConnectionStrings").Value;
services.AddScoped(options => new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = sugerstr,//连接符字串
DbType = DbType.SqlServer,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute,//从特性读取主键自增信息
SlaveConnectionConfigs = new List<SlaveConnectionConfig>() {//使用从数据库,支持多个
new SlaveConnectionConfig() { HitRate=10, ConnectionString=sugerstr }
}
}));
services.AddScoped<ClassGradeService>();
services.AddScoped<CourseService>();
services.AddScoped<StudentService>();
services.AddScoped<MiddleStudentCourseService>();
services.AddScoped<MiddleClassCourseCervice>();
#endregion #region EfCore//DbEfCore
services.AddDbContext<EfDbContext>(options => options.UseSqlServer("name=EfConnectionStrings:WriteConnection"));
services.Configure<DBConnectionOption>(Configuration.GetSection("EfConnectionStrings"));//注入多个链接
services.AddTransient<IDbContextFactory, DbContextFactory>();
#endregion
.Net 常用ORM框架对比:EF Core、FreeSql、SqlSuger的更多相关文章
- c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比
c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比对比 在6.22 号发布了 c# sqlsugar,his ...
- 各种ORM框架对比(理论篇,欢迎来观摩)
各种ORM框架对比 目前框架有以下 PetaPoco Dapper.NET Massive Simple.Data Chain PetaPoco 轻量级,以前单文件,目前有维护形成项目级别,适合多个数 ...
- ORM概述及常用ORM框架
一.ORM ORM(Object-relational mapping),即对象关系映射,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.也就是说,ORM是通过使用描述对象和数据库之间映 ...
- 各种ORM框架对比(理论篇,欢迎来观摩,并且纠正部分错误,防止误区)
各种ORM框架对比 目前框架有以下 PetaPoco Dapper.NET Massive Simple.Data Chain PetaPoco 轻量级,以前单文件,目前有维护形成项目级别,适合多个数 ...
- ORM框架对比以及Mybatis配置文件详解
ORM框架对比以及Mybatis配置文件详解 0.数据库操作框架的历程 (1) JDBC JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句 ...
- Dapper, Ef core, Freesql 插入大量数据性能比较(一)
需求:导入9999行数据时Dapper, Ef core, Freesql 谁的性能更优,是如何执行的,级联增加谁性能更佳. 确认方法:sql server 的 sys.dm_exec_query_s ...
- ASP.NET MVC学习---(一)ORM框架,EF实体数据模型简介
现如今 对象关系映射(ORM)框架 被大量的使用于企业级应用的开发 为什么要使用ORM? ADO.NET操作数据库不好吗? 我们可以仔细想想 当我们使用ADO.NET操作数据库的时候 我们需要先获取连 ...
- Net环境下比较流行的ORM框架对比
个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是Spring+Struts+Hibernate,除了在学习基础知识的时候被告知可以使用JDBC操作数据库之外,大量的书籍中都是讲述使 ...
- ORM框架:EF与NHibernate了解
在.Net Framework SP1微软包含一个实体框架(Entity Framework),此框架可以理解成微软的一个ORM产品.用于支持开发人员通过对概念性应用程序模型编程(而不是直接对关系存储 ...
随机推荐
- 如何正确地安装MathType 7?
作为一名资深的公式编辑器用户,在新版本MathType 7上线的第一时间,已经去体验了一把.那么要如何正确地安装呢?下面就来详细地介绍下它的安装方法. 步骤一 双击下载好的应用程序,就可以开始安装软件 ...
- Anno微服务引擎与传统应用相融合
1.Anno是什么? Anno是一个微服务引擎.在此之前我们通过 Viper项目对Anno有一个基本的认识,并且Viper也受到的很多朋友的喜欢,截止发稿前Viper在GitHub收获了300多个星. ...
- 五. Webpack详解
1. 什么是Webpack 1.1 引入 什么是webpack?这个webpack还真不是一两句话可以说清楚的. 我们先看看官方的解释:At its core, webpack is a static ...
- Beta冲刺随笔——Day_One
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Beta冲刺 作业正文 正文 其他参考文献 无 今日事今日毕 林涛: ...
- 第4.2节 神秘而强大的Python生成器精讲
一. 生成器(generator)概念 生成器是一个特殊的迭代器,它保存的是算法,每次调用next()或send()就计算出下一个元素的值,直到计算出最后一个元素,没有更多的元素时,抛出StopIte ...
- 第8.17节 Python __repr__方法和__str__方法、内置函数repr和str的异同点对比剖析
一. 引言 记得刚开始学习Python学习字符串相关内容的时候,查了很多资料,也做了些测试,对repr和str这两个函数的返回值老猿一直没有真正理解,因为测试发现这两个函数基本上输出时一样的.到现在老 ...
- 通俗易懂方式解说Python中repr(变量)和str(变量)函数的区别
老猿在<Python中repr(变量)和str(变量)的返回值有什么区别和联系>介绍了repr(变量)和str(变量)的区别和联系(对应特殊方法__repr__和__str__),但老猿刚 ...
- Python正则表达式re.match(r"(..)+", "a1b2c3")匹配结果为什么是”c3”?
在才开始学习正则表达式处理时,老猿对正则表达式:re.match(r"(-)+", "a1b2c3") 返回的匹配结果为"c3"没有理解,学 ...
- 【系统设计】不同分类的商品动态添加扩展属性的方法(WMS、小型电商)
在做公司WMS系统的时候,遇到了一个商品模块的设计问题,具体业务流程如下. 客户提供需要存放的商品清单,根据商品清单生成收货单给客户,然后生成入库单进行商品入库操作. 在生成这两个单之前首先要录入商品 ...
- flask注册蓝图报错
记录下这个我找了两天的坑... take no arguments() 这两天一直学习flask的时候,我把注册的蓝图,写成注册的form表单的 举个栗子 class TetsView(view.Me ...