2010-12-04 79 views
0

什么是最通用的方法来处理C#C#数据库交互

用户数据库的交互我希望能够easilly交换数据库驱动程序(数据提供者)。

我也觉得(不知道是否有可能),这将是巨大的,如果我可以从一些切换数据源DB样(例如,普通MySQL数据库)的东西绝对是另一个 - 如数据序列化为xml或任意二进制文件。 我怀疑最后一种情况是需要编写一些Query-File交互包装或类似的东西。


所以 - 可能有人共享的方式来实现所描述的行为吗?

我可以肯定地使用LINQ作为我的查询,它确实引入了一些抽象 - 但它足以使数据源可以互换吗?

如果是的话,那么我应该怎么做才能实现这一目标?我的开发流程将如何展现?

谢谢。

回答

2

下面是一个使用EF框架演练一个小程序存储库模式:

someRepository.Find.Where(something => something.IsRed && something.IsBig) 

创建一个名为包含所有的数据访问方法类型T的“IRepository”通用接口。

它看起来是这样的:

interface IRepository<T> where T : class 
{ 
    IEnumerable<T> FindAll(Expression<Func<T, bool>> exp); 

    T FindSingle(Expression<Func<T, bool>> exp); 

    // And many more! 
} 

创建一个抽象的“仓库”类实现了这个接口:

class Repository<T> : IRepository<T> where T : class 
{ 
    TestDataContext _dataContext = TestDataContext(); // Would be your EF Context 

    public IEnumerable<T> FindAll(Expression<Func<T, bool>> exp) 
    { 
     _dataContext.GetTable<T>().Where<T>(exp); 
    } 

    public T FindSingle(Expression<Func<T, bool>> exp) 
    { 
     _dataContext.GetTable<T>().Single(exp); 
    } 

    // And many more! 
} 

我们现在可以为ModelClass表创建一个接口/对象,它实现我们的'IRepository'和扩展抽象'Repository'类并实现'IModelClassInterface'的具体类:

interface IModelClassRepository : IRepository<ModelClass> 
{ 
} 

和匹配的存储库来实现它:

class ModelClassRepository : Repository<ModelClass>, IModelClassRepository 
{ 
} 

我建议,因为它为您提供了很大的灵活性,以及​​足够的力量来控制所有你的小实体使用这种方法。

调用这些方法将是超级简单的这样:

ModelClassRepository _repo = new ModelClassRepository(); 
_repo.Find.Where(something => something.IsRed && something.IsBig) 

是的,这意味着你必须做一些工作,但它是地狱更容易为你以后更改数据源。

你甚至可以用任何你选择的数据提供者来切换EF框架。无论是XML,db4o还是普通的旧Txt。

0

您应该查看存储库模式。

Asp.net还使用了所谓的提供模式创建热插拔组件,如会员供应商,地图供应商等

+1

存储库在我看来,除了一个好的数据库抽象工具外,还应该使用模式。 – 2010-12-04 01:06:03

+0

是的,使用存储库模式来保持你的代码不依赖于任何特定的数据库,然后使用像Entity Framework这样的体面的orm来保存处理sql和更改跟踪的头痛。 – rtpHarry 2010-12-04 01:20:59

0

1个字。

NHibernate的

NH3.0支持LINQ,其繁琐的换出的Posgres或MyFailSQL SQL服务器。 “像数据序列化到xml或任意二进制文件”

“。不知道这意味着什么。

+0

我不会调用NHibernate的“Generic”,但它会支持将DB从SQL Server交换到MySQL。 – 2010-12-04 01:09:49

+0

与使用L2S,EF,LightSpeed等不同,它不是“通用”,但它的地址能够使用LINQ类型查询并将数据库交换出去。 – Phill 2010-12-04 01:32:24

0

在.NET框架中,现在这个权利的事实标准是Entity Framework。因为最近EF版本4发布了,它解决了大量关于旧版本的疑虑 - 请检查您阅读的文章的日期,以便在网上查找EF的任何批评。在我看来,它是.NET空间中最好的数据库抽象工具(我曾尝试过)。

小心LINQ to SQL,微软不太可能投入大量资源来改进产品,因为EF现在是这一领域的旗舰产品。

0

我可以建议你看看LLBLGen Pro。我们一直在使用他们的ORM,它吹走了竞争对手。他们的新版本允许您使用他们的工具并为多个框架生成代码(实体框架,nhibernate,linq-to-sql)。但是他们的框架似乎是很多情况下最灵活的。

你可以从他的blog找到更多关于Frans的信息。他是LLBLGen的主要专家和LLBLGen的创始人。

0

“在C#中处理用户 - 数据库交互的最通用的方式是什么?”?

最通用的方式是ADO.NET ......这只是SQL块或调用存储过程在您的数据库中,有它的优点。然而,它有很多缺点,因为它不容易抽象到OOP没有任何intellisense ... EF非常酷,因为它解决了许多这些缺点,但如果它对你来说是新的语法需要一点点习惯