创建一个处理DatabaseFactory以便更容易使用DapperExtensions的DbContext
问题描述:
这一天我尝试使用DapperExtensions提出的一些基本的CRUD函数创建一个抽象的基础知识库。但是,作为例子给出的代码使用SqlConnection来连接到SQL Server数据库。我希望能够连接到各种数据库(SQL Server,MySql等)。此外他们的代码样本重复如下面的代码显示创建一个处理DatabaseFactory以便更容易使用DapperExtensions的DbContext
using (SqlConnection cn = new SqlConnection(_connectionString))
{
cn.Open();
//Code doing something here...
cn.Close();
}
,所以我想创造一个的DbContext,可以处理的创建,连接的开启和关闭,也可以创建每个CRUD功能正确的连接对象取决于我想要使用的数据库类型(一种数据库工厂)。
有没有人已经做到了,可以分享他的代码?
谢谢你们!
答
您正在使用Dapper-Extensions;以下代码仅适用于Dapper。但它并没有改变整个概念。而不是sql
你需要通过poco
。
请参阅this回答我如何实施IUnitOfWork
和DalSession
。在下面的代码中,BaseDal
就像BaseRepository
。
public abstract class BaseDal
{
internal BaseDal(IUnitOfWork unitOfWork)
{
dapperHandler = new DapperHandler(unitOfWork);
}
DapperHandler dapperHandler = null;
protected T Get<T>(string sql, DynamicParameters param) where T : class
{
var result = dapperHandler.Query<T>(sql, param).FirstOrDefault();
return result;
}
protected List<T> GetList<T>(string sql, DynamicParameters param) where T : class
{
var result = dapperHandler.Query<T>(sql, param).ToList();
return result;
}
protected int Insert(string sql, DynamicParameters param)
{
var result = dapperHandler.Execute(sql, param);
return result;
}
}
编辑1 对于小巧玲珑的扩展示例代码,请参阅this答案,我最近公布。
答
public abstract class ABaseRepository<M> : IBaseRepository<M>
where M : BaseModel
{
private static DbProviderFactory factory = DbProviderFactories.GetFactory(ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ProviderName);
protected static DbConnection connection;
public static IDbConnection CreateOpenConnection()
{
connection = factory.CreateConnection();
connection.Open();
return connection;
}
public dynamic Insert(M model)
{
dynamic multiKey;
using (IDbConnection con = CreateOpenConnection())
{
multiKey = con.Insert(model);
}
return multiKey;
}
}
这听起来像你正在试图建立一个真正的ORM的设施。您是否尝试过实体框架和NHibernate,并通过广泛的经验性基准测试得出结论:对于您的应用程序而言,这两者实际上都太慢了,因为您的服务具有令人难以置信的流行性,因此您拥有数百万条记录和极高的流量。 –