在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:sod开源软件地址:https://gitee.com/znlgis/sod开源软件介绍:菜鸟:“怎么使用EF(Entity Framework)框架啊?遇到麻烦了,救命!” Beginner:"How to use Entity Framework? SOS!" 老鸟:“试试SOD开发框架!” Senior men:"Try using the SOD Framework!" 一直使用EF并且老是遇到麻烦?何不解放自己并且试试SOD框架呢!它是简单的,并且容易使用的,轻量级的框架。 Still using EF and get stuck? Why not release yourself and try SOD!It is easy, and simple. 1,为什么需要SOD框架 --Why Need the SOD Framework?EF框架或大部分ORM框架的缺点就是SOD框架的优点,它拥有超过15年的项目应用历史,为你而生! The disadvantage of Entity Framework or most ORM frameworks is the advantage of SOD framework,It has more than 15 years of project application history, born for you! SOD 不止是一个ORM框架,还包括 SQL-MAP,DataControls,但它却是一个非常轻量级的框架,也是一个企业级数据应用开发的解决方案。 了解更多,看这里 SOD not only a ORM framework,include SQL-MAP,DataControls,detai ,but it is a light weight framework,and also it is an enterprise level data application development solution . see [this page] (http://www.pwmis.com/sqlmap)
SOD框架特别适合于以下类型的企业项目: The SOD framework is particularly suitable for the following types of enterprise projects:
SOD框架是少数仍然支持 .NET 2.0的框架,当然,它也支持 .NET 3.x,.NET 4.x,以及.Net core 和马上到来的.NET 5 。 The SOD framework is one of the few that still supports. Net 2.0. Of course, it also supports. Net 3. X,. Net 4. X, as well as. Net core and. Net 5. 2,功能特性 --functional and featuresSOD框架由PDF.NET框架发展而来,它包括以下功能: The SOD framework contains the following functional features: 核心三大功能 --Main purpose(S,O,D):SQL-MAP XML SQL config and Map DAL --基于XML配置的SQL查询和数据访问层映射SQL Map Entity --SQL语句映射为实体类 ORM OQL(ORM Query Language) --ORM查询语言:OQL Data Container --数据容器Entity Indexer --实体类索引器访问Table Map route Query --分表查询支持Micro ORM --微型ORM Data Controls Consistent Data Froms --一致的数据窗体访问技术WebForm Data Controls --Web窗体数据控件WinForm Data Controls --Windows窗体数据控件 有用的功能组件:Hot Use Cache --热缓存(缓存最常用的数据)Binary Serialization --二进制序列化Query Log --查询日志Command Pipeline --命令管道Distributed Identification --分布式ID 企业级解决方案:MVVM (Web/WinForm) --MVVM数据窗体Memory Database --内存数据库Transaction Log Data Replication --事务日志数据复制Data Synchronization --数据同步Distributed transaction --分布式事务OData Client --OData 客户端 工具:Integrated Development Tool --集成开发工具,包括实体类生成、SQL-MAP代码自动生成和多种数据库访问工具。Nuget support --Nuget 支持 源码和社区:Code: https://github.com/znlgis/sod or https://gitee.com/znlgis/sodHome: [http://www.pwmis.com/sqlmap](http://www.pwmis.com/sqlmap)Blog: [https://www.cnblogs.com/bluedoctor](https://www.cnblogs.com/bluedoctor)QQ Group:18215717,154224970 Learning more,see this page. 要了解更多,请看这篇文章:.NET ORM 的 “SOD蜜”--零基础入门篇或者参考框架作者编著的图书:《SOD框架企业级应用数据架构实战》。 3,ORM简单示例 --use ORM Simple example下面一个简单的SOD框架ORM使用的实例:在开始工作之前,先建立一个控制台项目,然后在程序包管理控制台,添加SOD框架的Nuget 包: Install-Package PDF.NET.SOD 这样即可获取到最新的SOD框架包并且添加引用,然后,就可以开始下面的工作了。已经建立好的当前Demo程序下载,看这里
public class User : EntityBase { public User() { TableName = "Tb_User"; IdentityName = "UserID"; PrimaryKeys.Add("UserID"); } public int ID { get { return getProperty<int>("UserID"); } set { setProperty("UserID", value); } } public string Name { get { return getProperty<string>("Name"); } set { setProperty("Name", value, 50); } } public string Pwd { get { return getProperty<string>("Pwd"); } set { setProperty("Pwd", value, 50); } } }
IUser user = EntityBuilder.CreateEntity<IUser>();
class LocalDbContext:DbContext { public LocalDbContext() : base("local") { //local 是连接字符串名字 } protected override bool CheckAllTableExists() { //创建用户表 CheckTableExists<User>(); return true; } } 注意:这一步骤只是为了 code first ,如果表事先已经存在,可以略去本步骤,当然下面的代码会有所调整。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="local" connectionString="Data Source=.;database=TestDB; Integrated Security=True" providerName="SqlServer"/> </connectionStrings> </configuration> providerName 是SOD框架的数据访问提供程序,PWMIS.Core.dll内置的可选简略名称有:Access | SqlServer | Oracle | SqlCe | OleDb | Odbc 在其它提供程序中,SOD框架提供了对 MySQL/Oracle/PostgreSQL/SQLite 等常见数据库的支持(扩展程序集),只要数据库提供了ADO.Net驱动程序,那么SOD框架经过简单包装即可保证支持。 如果是其它的扩展程序集,那么providerName应该写成下面的形式: providerName="<提供程序类全名称>,<提供程序类所在程序集>" 比如使用SOD封装过的Oracle官方的ADO.NET提供程序类: providerName="PWMIS.DataProvider.Data.OracleDataAccess.Oracle,PWMIS.OracleClient" 注意:提供程序程序集必须放到 跟PWMIS.Core.dll 同一个目录下,且是同一个兼容版本。有关数据库连接配置的详细内容,请参考作者图书:《SOD框架企业级应用架构实战》。
//创建数据库和表 LocalDbContext context=new LocalDbContext(); //重新指定主键,删除旧的测试数据 User oldUser = new User(); oldUser.PrimaryKeys.Clear(); oldUser.PrimaryKeys.Add("Name"); oldUser["Name"] = "zhang san"; //索引器使用 int count= context.Remove<User>(oldUser); User zhang_san = new User() { Name = "zhang san", Pwd = "123" }; count = context.Add<User>(zhang_san);//采用 DbContext 方式插入数据 当然插入数据的方式很多,具体请看本文提供的源码下载。
User user = new User() { Name = "zhang san" }; OQL q = OQL.From(user) .Select() .Where(user.Name) .END; PrintOQL(q); List<User> users = EntityQuery<User>.QueryList(q); 这种方式适合简单的相等条件查询,如果需要复杂的条件,可以修改成下面这个样子: //示例:采用操作符重载写比较条件 User user = new User(); OQL q = OQL.From(user) .Select() .Where(cmp => cmp.Property(user.Name) == "zhang san") .END; PrintOQL(q); //使用扩展方法 using PWMIS.Core.Extensions; List<User> users = q.ToList<User>(); 示例代码中的 可以修改成 >,<,like 等SQL支持的比较符号。如果需要更多条件,可以使用 &表示SQL的AND,| 表示 SQL的OR 逻辑关系,比如: //示例:采用操作符重载写比较条件 User user = new User(); OQL q = OQL.From(user) .Select() .Where(cmp => cmp.Property(user.Name) == "zhang san" & cmp.Comparer(user.Pwd ,"=","123") ) .END; PrintOQL(q); //使用扩展方法 using PWMIS.Core.Extensions; List<User> users = q.ToList<User>(); 实际上,框架提供了至少8种查询方式,详细内容,请看.NET ORM 的 “SOD蜜”--零基础入门篇 如果你只需进行“单表查询”,那么用泛型OQL是一个更好的选择。例如下面的示例,分页查询用户表的数据,并能够在第一次查询的时候自动探测到该查询未分页的时候的记录总数,然后在后续查询的时候传递该记录总数,从而实现一个高效的查询: void Test3(int pageNum, int pageSize) { var goql = OQL.From<User>() .Select() .OrderBy((o, u) => o.Asc(u.ID)); // .Limit(pageSize, pageNum, true); if (this.txtRecNumber.Text == "0" || this.txtRecNumber.Text == "") { goql.Limit(pageSize, pageNum, true);//第三个参数为true,表示在本次查询中自动探查符合查询条件的记录总数 } else { int allCount = int.Parse(this.txtRecNumber.Text); goql.Limit(pageSize, pageNum, allCount);//记录总数,以便准确分页。 } var list = goql.ToList(); // 单行泛型OQL方式: // var list = OQL.From<User>()..Select().OrderBy((o, u) => o.Asc(u.ID)).Limit(pageSize, pageNum, true) ; this.dataGridView1.DataSource = list; int recCount = goql.AllCount; this.txtRecNumber.Text = recCount.ToString(); } 附注: private static void PrintOQL(OQL q) { Console.WriteLine("OQL to SQL:\r\n{0}", q.ToString()); Console.WriteLine("SQL Parameters:\r\n{0}", q.PrintParameterInfo()); } 该方法可以打印OQL的SQL和参数信息,为你调试代码带来方便。 这样,一个简单的ORM使用实例就做好了。上面这段ORM例子,不仅仅适用于Oracle,使用在其它数据库都是可以得,只需要修改 连接字符串配置的 providerName和 connectionString 即可。 详细可以参考 [Oracle 免费的数据库--Database 快捷版 11g 安装使用与"SOD框架"对Oracle的CodeFirst支持] (http://www.cnblogs.com/bluedoctor/p/4359878.html) 附注:OQL也可以支持复杂的多表联合查询,如下面的例子: OQL q=OQL.From(entity1) .Join(entity2).On(entity1.PK,entity2.FK) //.Select(entity1.Field1,entity2.Field2) //不再需要指定查询的属性 .Select() .End;EntityContainer ec=new EntityContainer(q);var list=ec.MapToList(()=> { return new { Property1=entity1.Field1, Property2=entity2.Field2 }; });foreache(var item in list){ Console.WriteLine("Property1={0},Property2={1}",item.Property1,item.Property2);} 相比EF等ORM框架,SOD有更方便的批量插入和更新方式,都能通过OQL完成。比如OQL 的 Update 方法更新指定的实体类属性数据到数据,Where 方法 的条件表达式表示更新指定 RoleID 的所有数据,如果更新条件对应的数据是多条的,那么 即可实现“批量更新”的效果。 void TestUpdate() { Users user = new Users() { AddTime=DateTime.Now.AddDays(-1), Authority="Read", NickName = "菜鸟" }; OQL q = OQL.From(user) .Update(user.AddTime, user.Authority, user.NickName) .Where(cmp => cmp.Property(user.RoleID) == 100) .END; Console.WriteLine("OQL update:\r\n{0}\r\n",q); Console.WriteLine(q.PrintParameterInfo()); } 程序输出: OQL update: UPDATE [LT_Users] SET [AddTime] = @P0, [Authority] = @P1, [NickName] = @P2 WHERE [RoleID] = @P3 --------OQL Parameters information---------- have 4 parameter,detail: @P0=2013/7/28 22:15:38 Type:DateTime @P1=Read Type:String @P2=菜鸟 Type:String @P3=100 Type:Int32 ------------------End------------------------ 有关OQL的高级用法和详细示例,请参考这篇文章和它的系列链接:ORM查询语言(OQL)简介--实例篇 4,其它Thank you for your donation欢迎您捐助本项目,捐赠地址:框架官网 |
请发表评论