Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET核心MVC中使用ORM的正确方法?_C#_Sql Server_Entity Framework_Asp.net Core_Multi Tier - Fatal编程技术网

C# 在ASP.NET核心MVC中使用ORM的正确方法?

C# 在ASP.NET核心MVC中使用ORM的正确方法?,c#,sql-server,entity-framework,asp.net-core,multi-tier,C#,Sql Server,Entity Framework,Asp.net Core,Multi Tier,一个没有经验的web开发人员大声呼救 导言 我正在开发一个MVC web应用程序(由于我对它感兴趣,所以使用ASP.NET核心)。 在后端,有一个MSSQL服务器,它具有非常复杂的数据库(数千个表)。 在我的项目中,我希望根据用户的查询(发送表单请求)在视图中显示部分公共数据(在表中),然后允许用户下载数据(CSV、XML) 架构挑战 数据访问层 首先,我开始使用实体框架,但后来意识到无法将所有SQL语句转换为LINQ。原因是最简单的查询包含多个内部联接、左联接、SELECT语句和无数个表

一个没有经验的web开发人员大声呼救

导言

我正在开发一个MVC web应用程序(由于我对它感兴趣,所以使用ASP.NET核心)。 在后端,有一个MSSQL服务器,它具有非常复杂的数据库(数千个表)。 在我的项目中,我希望根据用户的查询(发送表单请求)在视图中显示部分公共数据(在表中),然后允许用户下载数据(CSV、XML)

架构挑战

  • 数据访问层

首先,我开始使用实体框架,但后来意识到无法将所有SQL语句转换为LINQ。原因是最简单的查询包含多个内部联接、左联接、SELECT语句和无数个表

  • 业务逻辑层
我计划构建一个RESTAPI,以JSON格式发送数据。就我所关心的.NET核心MVC而言,我可以将API控制器与表示层放在同一个项目中

  • 表示层
这是我唯一有经验的部分,使用MVC5构建web应用程序

大斗争

在这个项目中,我将不操纵数据,只读取数据并将其呈现给用户。我了解使用不同模型类(域、实体、ViewModel)的指导原则

我现在所做的,我想这是错误的:

  • MVC的API控制器将SQL查询结果作为类型DataTable对象返回(有一个SQL帮助器类来完成这项工作),到目前为止,我的控制器负责将对象序列化为JSON

  • 另一个控制器(通过视图中的模型绑定)通过HTML表单获取用户搜索条件,并通过绑定相应属性调用API控制器

问题终于解决了

  • 我应该坚持原始SQL查询而不是实体框架吗?如果是,我应该使用简单的分离类库(作为数据访问层)并在API中引用它吗?或者省略DAL,将所有SQL查询逻辑放入API中
  • 如果只读取实体框架,是否需要使用实体框架 不操纵数据?我打算做的唯一操作是在逻辑层中格式化外观
更新编辑:

在我的SQL查询中,我必须创建LINQ不支持的临时表。有什么建议吗?

如果这个问题将被标记为架构问题而不是编程问题,请接受我的道歉,并将我推荐到合适的论坛,在那里我可以得到帮助


非常感谢

您会发现LINQ查询比SQL更容易理解和调试。将数据访问层作为一个单独的项目,并对查询进行单元测试。为了保持坚实的原则,不要将数据层与api混合使用。如果您刚刚起步,EF Core可能会比EF6更好,主要是因为它的速度和可移植性。

“是最简单的查询,它包含几个内部联接、左联接、SELECT语句和无数个表”:显然,“无穷”是夸张的说法,如果没有这一点,LINQ to实体将非常高兴地处理多种方式的联接。但有时确实需要编写SQL、调用UDF或存储过程:所有这些都在EF中,而不会丢失使EF这样的ORM成为生产力赢家的更改跟踪。谢谢,@Richard,如果您有现有的复杂数据库脚本(包括变量和临时表),我一定会在LINQ中找到实体,我建议您在数据库中创建一个特殊的模式,将这些脚本保存为视图或存储过程。然后可以使用实体框架访问这些对象。或者,您可以通过dbcontext直接访问它们。对于使用现有复杂SQL查询的只读系统,我认为转换为LINQ@Nick.McDermaid非常感谢您的指导!对于像我这样的英孚新手来说,你的评论是非常有价值的,让我走上了正确的轨道,可以进一步调查!我仍然注意到EF core比dapper慢。因此,我选择dapper,但在体系结构方面,实现Asp.net.core+dapper+PostgreSQL的专业方法是什么。理解和调试更多地与开发人员的语言偏好有关。我当然发现LINQ比SQL更难使用,但我是一名数据库程序员。@hlo您的输入对我的架构斗争有很大帮助!我标记为答案,因为我从你的答案和其他人的评论中获得了足够的灵感,可以继续(我承认我的帖子有点宽泛,涉及多个问题,我最好关闭它并打开一个新的问题,以防我坚持我的项目)谢谢大家!保持社区的良好精神!我仍然注意到EF core比dapper慢。因此,我选择dapper,但在体系结构方面,实现Asp.net.core+dapper+PostgreSQL的专业方式是什么。