实体框架,Dapper和SSDT的组合?

时间:2012-10-01 20:32:08

标签: c# entity-framework dapper sql-server-data-tools

我正处于设置新开发项目的早期阶段,我不确定如何设置数据库访问策略。我将使用Visual Studio 2012,我的目标是.NET 4.5和SQL Server 2008或2012.

我不确定是否使用实体框架,如果使用,是什么程度。从数据库读取数据然后处理它将是此应用程序的主要工作,查询性能将是重要的。我知道EF5在这方面要比EF4.x好很多,但它并不是我最担心的固有EF开销(尽管像Dapper这样的东西仍然至少快两倍),但更多的是它为你提供的懒惰作为开发人员,因为通过LINQ查询太多了。所以我希望纯SQL查询成为获取数据的主要方式。

然而,我最想念EF的是:

  1. 编译时间查询检查。
  2. 跟踪改变的。
  3. 代码优先发展。
  4. 工作单位模式。
  5. 我可以在没有变更跟踪的情况下生活,通常不难确定新的或更新的内容。

    我真正想要的是,这个项目的开发人员不必与表设计人员混在一起,但他们可以简单地编写POCO。所以,为此,我非常感谢EF的代码第一种方法。有了这个,开发人员可以克隆源代码,调用update-database并拥有一个有效的本地数据库。这对我来说过去很有用。

    对我来说非常重要的另一件事是工作单元模式,或者插入和更新的原子性。我想排队所有更改,并在我调用SaveChanges时有一个点。对于像DapperExtensions这样的库,您可以获得Insert方法,但它会立即执行数据库调用。你可以通过在它周围包装一个事务来使它成为原子,但这与排队它不一样。所以我必须为此自己推出某种排队机制。

    对于编译时查询检查,我考虑使用SQL Server数据工具(SSDT)。查询将是存储过程(以避免C#代码中的大查询字符串blob)并使用SSDT这些可以在构建时检查。 SSDT的另一个优点是您可以将存储过程从Visual Studio部署到目标数据库。最重要的是,这些SQL脚本将存在于源代码控制中。

    因此,我的解决方案基本上由三种数据访问技术组成:

    实体框架

    • 负责从POCO数据模型创建数据库。
    • 将用于通过其工作单元模式插入/更新数据。需要注意的是,您首先需要通过SQL获取的Attach个实体才能进入上下文。

    SSDT

    • 将用于在编译时验证SQL脚本。
    • 允许脚本存在于Git中。
    • 将部署EF无法部署到您的数据库的内容。

    Dapper /其他Micro ORM

    • 将用于获取数据

    我不禁觉得这是一个弗兰肯斯坦解决方案,我使用各种各样的点点滴滴。我还不确定SSDT和EF会以一种很好的方式协同工作。这个快速示例似乎工作正常:

    // Combo of Dapper, EF and a stored proc that was published through SSDT
    static void Main(string[] args)
    {
      var connectionString = ConfigurationManager
        .ConnectionStrings["DbDataContext"].ConnectionString;
    
      using (var conn = new SqlConnection(connectionString))
      using (var ctx = new DbDataContext())
      {
        conn.Open();
    
        var product = conn.Query<Product>("GetProduct", 
          commandType: CommandType.StoredProcedure).First();
    
        ctx.Products.Attach(product);
    
        var order = new Order
        {
          Product = product
        };
    
        ctx.Orders.Add(order);
    
        ctx.SaveChanges();
    
      }
    }
    

    这种方法似乎可行,但它也很混乱。但是,如果我放弃SSDT,我将错过编译时检查SQL,如果我放弃实体框架,我将错过代码优先和更容易插入,如果我放弃直接SQL我会想念表现出很大一部分。

    我有一个替代方案吗?如果没有,这里最好的方法是什么?

1 个答案:

答案 0 :(得分:3)

你应该看看ServiceStack.Orm。

https://github.com/ServiceStack/ServiceStack.OrmLite

它有一些功能,包括使用tt文件的模型gen,它也可以创建数据库表。

它支持LINQ。

它的疯狂闪电。