问题 我应该在2016年使用哪个ORM来与SQL服务器通信? [关闭]


我的大部分服务器端体验都是使用nodeJS meteor或rails,所以我还没有丰富的.Net知识。在rails中,很容易选择ORM,因为ActiveRecord是城里唯一的游戏,或者看起来如此。我的方法通常是使用ORM查询所有内容,如果你不能将它拉下来,那么请下拉到原始SQL。

但是,我正在尝试阅读有关在.Net 4.5或更新的应用程序中查询我的数据库的教程和课程,我对未来的方式感到困惑。我在下面看到教程

  • Linq Lambda语法
  • Linq查询语法
  • 实体框架

现代.net应用程序的建议ORM是什么? 看起来我可以在上述所有内容中进行基本的CRUD操作。但是,一个人更适合说跨表加入吗?请注意,我只计划针对我的.net解决方案查询Microsoft SQL服务器数据库。

让我感到困惑的是阅读EF取代linq然后阅读EF也使用了linq。因此,当我看到一个例子说选择所有列我不知道我是否使用过去或未来的语法。也只是看代码我不知道它的linq或EF。我可以告诉它的查询或lambda语法。


6365
2018-05-12 14:24


起源

LINQ是一个由“提供者”支持的.NET概念。 EF有一个LINQ提供者,NHibernate也是如此。 EF和NH将在幕后将从LINQ创建的表达式树转换为SQL查询。 - David Osborne
不,ActiveRecord不是城里唯一的游戏,除非您只处理一次只处理几行的低流量应用程序。为什么只与...合作 一 在您可以加载所需的所有对象并绑定到它们时记录?这就是为什么Micro-ORM更适合a的原因 批量 场景。 ORM是 不 用于CRUD操作。如果您没有具有自定义行为的实体,则不需要 O 部分 - Panagiotis Kanavos
stackoverflow.com/questions/5101974/net-orm-comparison - David Osborne
你应该使用F#和这个: fsprojects.github.io/SQLProvider - Tuomas Hietanen


答案:


您提到的选项并不是所有ORM,在这3中唯一的ORM是EF。 .net中还有其他流行的ORM,包括:

  • NHibernate的
  • LLBLGen亲
  • ActiveRecord的

他们中的大多数都支持LINQ。 EntityFramework是较年轻的,但是它与VS的集成并且开箱即用可以使它成为.net中最受欢迎的ORM,它将LINQ替换为实体而不是LINQ本身。 msdn中定义的LINQ(语言集成查询)可以与不同的数据源一起使用。

LINQ是一组扩展强大查询功能的功能   C#的语言语法。 LINQ引入标准,易于学习   查询和更新数据的模式,技术可以   扩展到可能支持任何类型的数据存储。互联网   框架包括支持使用的LINQ提供程序程序集   LINQ with .NET Framework集合,SQL Server数据库,ADO.NET   数据集和XML文档。

有两种不同的语法可以使用LINQ,主要称为Fluent语法和Query语法。

如果您刚才提到.net,我建议使用EF语言流畅,这将是开始在.net中查询数据库的最快方法。


9
2018-05-12 14:58



我是否必须从流畅的语法切换到某些情况下的查询语法(跨表连接)或者他们是否有类似的功能子集? - ngnewb
你可以找到一个很好的讨论 这里 - VahidNaderi
我可以在不同的模型或相同的模型中混合语法,还是一个坏主意? - ngnewb
@ngnewb是的,你可以根据需要混合搭配。 fluent / lambda / method语法永远不会消失,因为查询语法在后台运行的方式也是如此。查询语法只是在fluent / lamda / method语法之上的语法糖,并最终在编译之前进行转换。 - Robert McKee


简短的回答是实体框架。

我认为令人困惑的是,您可以将Linq Lambda和Linq Query语法与Entity Framework一起使用。但未来(在我看来)是Fluent API。

我一直在使用Entity Framework 7(预发布),我得到的印象是它专注于Fluent API。哪个对我很好,因为我比Linq语法更喜欢它。


4
2018-05-12 14:39



为什么不NHibernate? - David Osborne
但是现在实体框架6是标准吗?所以,如果我想加入3个表,这将是一个很好的答案 stackoverflow.com/questions/21051612/... - ngnewb
还有什么方法可以知道我在查看模型或查询时正在查看实体框架代码?我试着只看3岁或更新的SO帖子至少假设它.net 4.5或更新 - ngnewb
@ngnewb - 我觉得这不重要因为语法是一样的。但我会选择一种语法并坚持下去。 - Clint B
和OP一样,你要比较苹果和橘子。 “流利的API”是 大多 用于表示映射API。在谈论LINQ时,有流畅的语法(或方法语法) - 这意味着调用 Queryable 扩展方法,或者有查询语法(或综合语法) - 这意味着在代码中构建LINQ查询的类似SQL的语法。 两者都是LINQ语法,教条地偏爱一个在另一个之上真的没有意义。使用为手头的任务生成最佳可读代码的那个。 - Gert Arnold


试试Vega https://github.com/aadreja/vega 它使用简单,是最快的.net ORM之一,具有许多令人兴奋的功能。

以下是开始的步骤: -

1)创建一个从Vega.EntityBase派生的实体类 示例: -

[Table(NeedsHistory = true)]
public class Country : EntityBase
{
    [PrimaryKey(true)]
    public int Id { get; set; }
    public string Name { get; set; }
    public string ShortCode { get; set; }
}

2)执行CRUD操作

插入 - 只需为插入创建实体和设置属性。创建一个连接对象,将其传递给Repository并调用Add方法,该方法将返回新创建记录的Id

Country country = new Country()
    {
        Name = "India",
        ShortCode = "IN",
        CreatedBy = 1  //user id created record
    };

using (SqlConnection connection = new SqlConnection(conString))
{
     Repository<Country> countryRepo = new Repository<Country>(connection);
     int result = (int)countryRepo.Add(country);
}

更新 - 更新记录使用存储库的更新方法

City city = new City()
{
    Id = 1,
    Name = "Ahmedabad",
    State = "GU",
    CountryId = 1,
    Longitude = 102.23m,
    Latitude = 124.23m,
    UpdatedBy = 1
};

using (SqlConnection con = new SqlConnection(connectionString))
{
     Repository<City> cityRepo = new Repository<City>(con);
     bool result = cityRepo.Update(city);
}

读取列表 - 读取具有指定条件的所有记录,并将其转换为可转换为List的可枚举对象。

//read all records
using (SqlConnection con = new SqlConnection(connectionString))
{
     Repository<City> cityRepo = new Repository<City>(con);
     List<City> cityList  = cityRepo.ReadAll().ToList();
}

//read all with specified dynamic criteria
using (SqlConnection con = new SqlConnection(connectionString))
{
     Repository<City> cityRepo = new Repository<City>(con);
     List<City> cityList = cityRepo.ReadAll("Name=@Name", new { Name = "Ahmedabad" }).ToList(); //Dynamic criteria
}

请参阅更多文档 https://github.com/aadreja/vega/wiki/Repository


0
2018-04-27 03:18