C#数据库交互

时间:2010-12-04 01:01:02

标签: c# database linq

C#

中处理用户数据库互动的最通用方式是什么?

我希望能够轻松交换数据库驱动程序(数据提供者)。

我也认为(不确定是否可能)如果我可以从类似DB的中切换数据源会很棒(例如,plain { {1}}数据库)绝对是另一个 - 比如序列化为MySQL或任意二进制文件的数据。 我怀疑最后一种情况需要编写一些Query-File交互包装或类似的东西。


那么 - 有人可以分享来实现所描述的行为吗?

我绝对可以将xml用于我的查询,它确实引入了一些抽象 - 但它是否足以使数据源可以互换?

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

感谢。

6 个答案:

答案 0 :(得分:2)

这是使用EF Framework的小型存储库模式演练:

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

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

看起来像这样:

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

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

    // And many more!
}   

创建一个实现此接口的抽象“Repository”类:

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!
}

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

interface IModelClassRepository : IRepository<ModelClass>
{
}

以及实现它的匹配存储库:

class ModelClassRepository : Repository<ModelClass>, IModelClassRepository
{
}

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

以这种方式调用这些方法非常简单:

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

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

您甚至可以使用您选择的任何数据提供者切换EF Framework。无论是XML,db4o还是普通的旧文本。

答案 1 :(得分:0)

您应该查找存储库模式。

Asp.net还利用所谓的提供者模式来创建可交换的组件,例如成员资格提供者,站点地图提供者等。

答案 2 :(得分:0)

1个字。

NHibernate的

NH3.0支持LINQ,以及为Posgres或MyFailSQL换出SQL Server的琐事。

“将数据序列化为xml或任意二进制文件。”不知道这意味着什么。

答案 3 :(得分:0)

在.NET框架中,现在的事实标准是Entity Framework。因为最近发布的EF版本4解决了旧版本的大量问题 - 请查看您阅读的文章的日期。现在,在我看来,它是.NET领域中最好的数据库抽象工具(我已经尝试过)。

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

答案 4 :(得分:0)

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

您可以在blog找到更多关于Frans的信息。他是LLBLGen的主要创始人和LLBLGen的创始人。

答案 5 :(得分:0)

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

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