C# 在ASP.NET核心MVC中使用ORM的正确方法?
一个没有经验的web开发人员大声呼救 导言 我正在开发一个MVC web应用程序(由于我对它感兴趣,所以使用ASP.NET核心)。 在后端,有一个MSSQL服务器,它具有非常复杂的数据库(数千个表)。 在我的项目中,我希望根据用户的查询(发送表单请求)在视图中显示部分公共数据(在表中),然后允许用户下载数据(CSV、XML) 架构挑战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语句和无数个表
- 数据访问层
首先,我开始使用实体框架,但后来意识到无法将所有SQL语句转换为LINQ。原因是最简单的查询包含多个内部联接、左联接、SELECT语句和无数个表
- 业务逻辑层
- 表示层
- MVC的API控制器将SQL查询结果作为类型DataTable对象返回(有一个SQL帮助器类来完成这项工作),到目前为止,我的控制器负责将对象序列化为JSON
- 另一个控制器(通过视图中的模型绑定)通过HTML表单获取用户搜索条件,并通过绑定相应属性调用API控制器
- 我应该坚持原始SQL查询而不是实体框架吗?如果是,我应该使用简单的分离类库(作为数据访问层)并在API中引用它吗?或者省略DAL,将所有SQL查询逻辑放入API中
- 如果只读取实体框架,是否需要使用实体框架 不操纵数据?我打算做的唯一操作是在逻辑层中格式化外观
非常感谢 您会发现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的专业方式是什么。