jjzjj

c# - Entity Framework ,Dapper和SSDT的组合?

coder 2024-06-03 原文

我正在建立一个新的开发项目的早期阶段,我不确定如何建立我的数据库访问策略。我将使用visual studio 2012,目标是.net 4.5和sql server 2008或2012。
我不确定的是是否使用实体框架,如果是,使用到什么程度。由于从数据库中读取数据并对其进行处理将是此应用程序的主要工作,因此查询性能将非常重要。我知道ef5在这方面比ef4.x好得多,但我最担心的并不是它固有的ef开销(尽管dapper的速度至少是前者的两倍),而是它给开发人员带来的更多的懒惰,因为通过linq查询太多太容易了。所以我希望纯sql查询是获取数据的主要方式。
不过,我最怀念的是EF:
编译时查询检查。
更改跟踪。
代码优先开发。
工作单位模式。
我可以生活在没有变化跟踪,它通常不那么难确定什么是新的或更新。
我想要的是,这个项目的开发人员不必摆弄桌面设计员,而是可以简单地编写POCOs。因此,我非常感谢ef的代码优先方法。这样,开发人员可以克隆源代码,调用update-database并有一个工作的本地数据库。这在过去对我很有帮助。
另一件对我非常重要的事情是工作单元模式,或者说插入和更新的原子性。我想将所有更改排队,并有一个调用SaveChanges的点。对于像DapperExtensions这样的库,您会得到一个Insert方法,但它会立即执行数据库调用。你可以通过封装一个事务来实现它的原子化,但这并不等同于排队。所以我得自己弄点排队机制。
对于编译时查询检查,我考虑使用sql server数据工具(ssdt)。查询将是存储过程(以避免C代码中的大查询字符串斑点)和使用SSDT,这些可以在生成时检查。SSDT的另一个优点是可以将存储过程从VisualStudio部署到目标数据库。而且最重要的是,这些脚本的sql脚本将存在于源代码管理中。
因此,我的解决方案基本上包括三种数据访问技术:
实体框架
将负责从poco数据模型创建数据库。
将用于通过其工作单元模式插入/更新数据。一个警告是,首先必须将通过sql获取的实体Attach放到上下文中。
SSDT
将用于在编译时验证SQL脚本。
允许脚本位于git中。
将部署EF无法部署到数据库中的东西。
适配器/其他微型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,我将错过很大一部分性能。
有没有我忽略的其他选择?如果没有,这里最好的方法是什么?

最佳答案

你应该去看看servicestack.orm。
https://github.com/ServiceStack/ServiceStack.OrmLite
它具有大量的特性,包括使用TT文件的模型Gen,它也可以创建DB表。
它支持linq。
而且它的闪电速度惊人。

关于c# - Entity Framework ,Dapper和SSDT的组合? ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12680626/

有关c# - Entity Framework ,Dapper和SSDT的组合?的更多相关文章

  1. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  2. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  3. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  4. ruby - 最多 n 的组合 - 2

    给定一个数组a,什么是实现其组合直到第n的最佳方法?例如:a=%i[abc]n=2#Expected=>[[],[:a],[:b],[:c],[:a,b],[:b,:c],[:c,:a]] 最佳答案 做如下:a=%w[abc]n=30.upto(n).flat_map{|i|a.combination(i).to_a}#=>[[],["a"],["b"],["c"],["a","b"],#["a","c"],["b","c"],["a","b","c"]] 关于ruby-最多n的组合,我

  5. ruby - Rails 组合多个 activerecord 关系 - 2

    我想合并多个事件记录关系例如,apple_companies=Company.where("namelike?","%apple%")banana_companies=Company.where("namelike?","%banana%")我想结合这两个关系。不是合并,合并是apple_companies.merge(banana_companies)=>Company.where("namelike?andnamelike?","%apple%","%banana%")我要Company.where("名字像?还是名字像?","%apple%","%banana%")之后,我会写代

  6. ruby - 如何在 ruby 中组合/排列? - 2

    我有一个熟悉的问题,看起来像是数学世界的排列/组合。如何通过ruby​​实现以下目标?badges="1-2-3"badge_cascade=[]badges.split("-").eachdo|b|badge_cascade["1","2","3"]ButIwantittobeis:=>["1","2","3","1-2","2-3","3-1","2-1","3-2","1-3","1-2-3","2-3-1","3-1-2"] 最佳答案 函数式方法:bs="1-2-3".split("-")strings=1.upto(bs.

  7. ruby - 更快的 n 选择 k 来组合数组 ruby - 2

    在尝试解决“网格上的路径”问题时,我编写了代码defpaths(n,k)p=(1..n+k).to_ap.combination(n).to_a.sizeend代码工作正常,例如ifn==8andk==2代码返回45,这是正确的路径数。但是,当使用较大的数字时,代码非常慢,我正在努力想出如何加快这个过程。 最佳答案 与其构建组合数组只是为了计算它,不如编写function定义组合的数量。我敢肯定还有包含此功能和许多其他组合函数的gem。请注意,我使用的是gemDistribution对于Math.factorial方法,但这是另一种

  8. c# - C# 中的 Flatten Ruby 方法 - 2

    我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume

  9. ruby-on-rails - Ruby 哈希组合 - 2

    对于一个电子商务应用程序,我试图将选项的散列(每个选项都有一系列选择)转换为代表这些选择组合的散列数组。例如:#Input:{:color=>["blue","grey"],:size=>["s","m","l"]}#Output:[{:color=>"blue",:size=>"s"},{:color=>"blue",:size=>"m"},{:color=>"blue",:size=>"m"},{:color=>"grey",:size=>"s"},{:color=>"grey",:size=>"m"},{:color=>"grey",:size=>"m"}]Input内部可能有额

  10. ruby - 可以像在 C# 中使用#region 一样在 Ruby 中使用 begin/end 吗? - 2

    我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用

随机推荐