在项目中会有很多常用的操作方法如添加、删除、修改等,而在使用EF时虽然已是ORM,但仍然会习惯性的在业务层写大量类似方法,为此,分享一个我在项目使用的公共基类,经过多次修改,已在mssql和oracle数据库项目上使用没问题。希望对使用EF开发项目的朋友有帮助,不是说写的有多好,只是为了分享,因为我在使用EF之初也一直在找这样一个类但资源很少。 欢迎拍砖,不要伤人就行。。。
以下是 Repository.cs源码 :
2 using System.Linq;
3 using System.Linq.Expressions;
4 using System.Data.Objects;
5 using System.Data.Common;
6 using System.Transactions;
7
8 namespace System.Data.Entity
9 {
10 public class Repository<TEntity> : IDisposable where TEntity : class
11 {
12 #region 私有属性
13 private ObjectContext objectContext;
14 private string entitySetName;
15 private string keyProperty = "ID";
16 private string keyPropertyType = "Int32";
17 #endregion
18
19 #region 公共属性
20 /// <summary>
21 /// 获得提供用于查询和使用对象形式的实体数据功能
22 /// </summary>
23 protected ObjectContext ObjContext
24 {
25 get
26 {
27 if (this.objectContext == null)
28 {
29 throw new Exception("数据库对象为空");
30 }
31 if (this.objectContext.Connection.State == System.Data.ConnectionState.Closed)
32 {
33 this.objectContext.Connection.Open(); //如果关闭则打开
34 }
35 return this.objectContext;
36 }
37 set
38 {
39 this.objectContext = value;
40 objectContext.MetadataWorkspace.LoadFromAssembly(typeof(TEntity).Assembly);
41 }
42 }
43 /// <summary>
44 /// 实体名字
45 /// </summary>
46 public string EntitySetName
47 {
48 get { return this.entitySetName; }
49 }
50 /// <summary>
51 /// 主键字段名
52 /// </summary>
53 public string KeyProperty
54 {
55 get { return this.keyProperty; }
56 }
57 /// <summary>
58 /// 主键字段类型
59 /// </summary>
60 public string KeyPropertyType
61 {
一 大概思路
1.1 工作原理
从数据库(这里主要用Oracle数据库),读取相应的表结构(如表名、列名、列类型、列注释等),然后读取模板(用txt写的模板),最后通过匹配生成目标代码。
二 代码解释
2.1 文件解释
2.2 解析方式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace [XXX]
{
public class [table_name]
{
public [table_name]()
{
}
/// <summary>
/// [table_name]构造函数
/// </summary>
<!--/// <param name="v_[col_name]">[col_name]</param>
-->
public [table_name](<!--[col_type] v_[col_name][,]-->)
{
<!--this._[col_name] = v_[col_name];
-->
}
<!--
/// <summary>
/// [col_name]
/// </summary>
private [col_type] _[col_name];
public [col_type] [col_name]
{
get { return this._[col_name]; }
set { this._[col_name] = value; }
}
-->
}
}
App.config(配置数据库连接),以T_[filename].txt为模板,规则如下:
[XXX]暂时不考虑
<!-- -->标识符里的为可循环内容
[table_name]、[col_name]、[col_type]、[col_comment]、[create_time]、[,]、[col_comment]为可替换内容
解析顺序:
1. 读取数据库所有表 或 根据SQL语句,将表结构放入一个List<TableObject>结构里
2. 读取全文
3. 读取<!-- -->内容,以取代 [table_name]、[col_name]、[col_type]、[col_comment]、[create_time]、[,]
4. 继续读取,以取代[table_name]、<!-- -->
5. 输出[table_name].cs文件
2.3 以T_为开头的模板文件
-- create by: zhyongfeng
-- create date: [create_time]
-- fun:
-- P_CONDITION:where条件
-- P_TYPE:是否分页
-- P_CUR_PAGE:第几页
-- P_PAGE_SIZE:每页记录数
-- X_TOT_REC:总记录数
-- X_TOT_PAGE:总页数
-- X_CUR:输出
*****************************************/
procedure [table_name]_Info_Select(P_CONDITION in Varchar2,
P_TYPE varchar2,
P_CUR_PAGE integer,
P_PAGE_SIZE integer,
P_SORT varchar2,
P_DIR varchar2,
X_TOT_REC out integer,
X_TOT_PAGE out integer,
X_CUR out curtype) as
V_SQL long;
V_TOT_REC integer;
V_TOT_PAGE integer;
begin
V_SQL := 'select <!--e.[col_name][,] -->
from [table_name] e';
exception
When others then
rollback;
dbms_output.put_line('异常提示:'||sqlcode||':'||sqlerrm);
end;
/*****************************************
-- create by: zhyongfeng
-- create date: [create_time]
-- fun:增加
<!-- -- P_[col_name]:[col_comment]
-->
-- X_RE:输出
-- X_MSG:输出
*****************************************/
procedure [table_name]_Add(
<!-- P_[col_name] in [col_type],
--> X_RE out integer,
X_MSG out varchar2) is
V_COUNT integer;
begin
--新增数据
insert into [table_name](<!--[col_name][,]-->)
values(SEQ_EXAM_QUESTION.Nextval<!--[,]-->);
X_RE := 1;
X_MSG := '提示:新增成功!';
commit;
exception
when others then
rollback;
SharpDevelop
强大的插件系统,通过Addin构建成一个功能齐全的.net开发IDE。核心是AddInTree。跟随这个项目开发许多有用的组件,比如功能文本编辑器(ICSharpCode.TextEditor),SharpZipLib等。
链接:http://www.icsharpcode.net/
DotNetNuke
这个就是著名DNN,使用VB.NET进行开发。通过其基本架构可进行堆积木式快速建站。而且支持子网站系统。其由asp.net Portal start kit进化而来。
链接:http://www.dnnchina.net/ ,http://www.dotnetnuke.com
Community Server
这个也是一个很著名的ASP.NET项目,记得好像最早系统原形为asp.net Forums,后来加入了.Text Blog 和nGallery成为一个完整的通用系统。对应的中文版本为宝玉修改的CCS。
链接:http://communityserver.org/
Rainbow
另外一个类似于DNN的系统,使用C#进行开发。
链接:http://www.rainbowportal.net/
RssBandit
一个客户端的RSS查看器,使用C# 进行开发,最大的特点是数据存储采用xml文件。
链接:http://www.rssbandit.org/
FreeTextbox
Web上的一个Html超文本编辑器,早些版本是开源的,现在还是免费使用,不过源代码需要购买。
链接:http://www.freetextbox.com
World Wind
使用.NET开发的一个Windows窗体系统,以地球外观看得角度提供全球定位功能,类似于Google Earth。
链接:http://worldwind.arc.nasa.gov
log4net
对应Java中的log4j。一个强大的日志管理模块。
链接:http://logging.apache.org/log4net/
Monodevelop
非Windows 系统下的.net 平台开发工具。
链接:http://www.monodevelop.com
Paint.NET
使用.net开发的画图软件,功能不错。
链接:http://www.getpaint.net/index.html
Nunit
对应Java中的Junit,非常著名的单元测试工具。
链接:http://www.nunit.org/
FCKeditor
Web上的又一个Html超文本编辑器。
链接:http://www.fckeditor.net/
Nlog
一个日志管理库,类似于Log4Net。
链接:http://www.nlog-project.org/
ManagedSpy
.net 平台下的Spy ++,支持通过.net 2.0开的Windows Forms应用程序。
链接:http://msdn.microsoft.com/msdnmag/issues/06/04/ManagedSpy/
Guidance Explore
类似于一个.net平台编程问题简答的FAQ。不过提供的都是英文。
链接:http://www.codeplex.com/Wiki/View.aspx?ProjectName=guidanceExplorer
Terrarium
一个.net开发的多人游戏。玩这个游戏可以提高编程能力^_^。
链接:http://www.windowsforms.net/Default.aspx?tabindex=4&tabid=49
TaskVision
任务管理系统,一个经典的Smart Client智能客户端程序。
链接:http://www.windowsforms.net/Default.aspx?tabindex=4&tabid=49
IssueVision
事务管理系统,Smart Client智能客户端程序。
链接:http://www.windowsforms.net/Default.aspx?tabindex=4&tabid=49
FotoVision
又一个值得学习的.net开发的Windows应用程序。
链接:http://www.windowsforms.net/Default.aspx?tabindex=4&tabid=49
Infragistics Tracker Application
由Infragistics开发的Smart Client智能客户端程序。
链接:http://www.windowsforms.net/Default.aspx?tabindex=4&tabid=49
Windows Forms RSS Portal
一个.net 开发的聚合器。
链接:http://www.windowsforms.net/Default.aspx?tabindex=4&tabid=49
Enterprise Library
微软的企业库,对原早些时候开发的一些Block 模块进行整合提供企业统一的接口,新版本使用了.net 2.0的的许多功能。
链接:http://msdn.microsoft.com/practices/
PetShop
基于N-tier设计的电子商务网站,没什么好说的了。
链接:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/bdasamppet4.asp
XmlNotepad
一个用.net 开发的xml文件编辑器。
链接:http://www.microsoft.com/china/msdn/library/data/xml/xmlnotepad.mspx
DockManager Control
一个很不错的实现类似于VS 2005的界面某些功能的组件。
链接:http://www.codeproject.com/vb/net/DockPanelSkin.asp
Starter Kits for Visual Web Developer
该套件为学习研究应用asp.net2.0的开发人员提供许多宝贵资源,很不错。
本文链接