在使用ASP.NET Core MVC和Sqlite时,如何使用EF Core - 正确的类结构

3

我是一个相对新手的程序员,有一些问题需要解决。我目前正在尝试从微软官方书籍中学习ASP.NET MVC,因为我打算在几个月内获得认证,并同时为同事开发一个小项目。我决定不使用.net框架,而是使用.net core完成所有工作,但是我发现EF Core中的内容与书中所学有所不同。

我正在使用Sqlite作为数据库,已经基本上完成了插件的设置,但是我遇到了一些问题,因为互联网上提供给我的信息存在冲突。

在ASP.NET框架版本中,微软建议您这样做:您有一个Model“PersonModel”和一个Context“PersonContext”,放在Model文件中并继承DbContext。这个“PersonContext”包含各种DbSet<T>对象,具体取决于要创建哪些表等。在.net core中,这对我来说没有改变。然而,在这之后,微软告诉我要制作一个“PersonInitializer”,它应该继承“DropCreateDatabaseAlways<PersonContext>”,然后重写Seed方法(方便地放置了一个“getFileBytes”方法用于图像等)。

现在,在core中,没有可以继承的DropCreateDatabaseAlways类,这让我相信这种结构实际上根本不是由.net core所预期的。我在这里听到了各种关于使用各种CLI命令的事情,但最终我对这里的“正确”做法感到非常困惑?

1个回答

3
我认为你目前最大的问题就是正确地获取信息。承认,这有点令人困惑,特别是对于完全新手的人来说。
先简单介绍一下背景:有ASP.NET、ASP.NET MVC和ASP.NET Core。ASP.NET实际上什么都不是,但由于当时你只能使用ASP.NET Web Forms,因此它成为了ASP.NET Web Forms的简称。然后,微软推出了ASP.NET MVC,它在ASP.NET的基础上添加了一个现代Web应用程序框架,模仿MVC(模型-视图-控制器)模式。它比Web Forms有了很大的改进,但并没有从旧系统中彻底脱离出来,使其成为真正伟大的应用程序开发框架。由于它依赖于System.Web(一个庞大的DLL家族)和完整的.NET Framework,因此它速度慢,难以部署,并且与容器化等事物完全不兼容。那么,ASP.NET Core应运而生,它是从头开始的完全重写。
ASP.NET MVC有一个姊妹框架叫ASP.NET Web Api,从技术上来讲,你仍然可以在同一项目中使用ASP.NET Web Forms。事实上,一个项目可以同时利用这三个框架,这听起来很混乱。ASP.NET Core最初通过只有一个系统来处理传统的Web应用程序和API,消除了这种混乱。因此,如果您正在寻找关于Core的信息,只需要搜索"Core"。寻找ASP.NET Core MVC只会导致过时的信息。
尽管大多数曾使用“真正”的Web应用程序框架的开发人员鄙视Web Forms,但遗憾的是,微软在其无限的智慧中决定将其复活,至少在精神上。因此,Razor Pages诞生了,自那以后就必须区分ASP.NET Core Razor Pages和ASP.NET Core Proper,后者现已更名为ASP.NET Core MVC,这使得人们更难过滤出一个框架与另一个框架的信息。至少目前来看,Razor Pages仍然不如MVC风格突出,值得庆幸的是,它们在Core的核心功能上没有太多变化,因此不需要进行不同的讨论。长话短说,你几乎只需在每个搜索前加上“asp.net core”(用引号括起来,以便作为短语搜索),这通常会给你提供相关信息 - 大部分情况下是这样的。
下一个问题是,ASP.NET Core是在高度可见性下开发的,完全公开,并且有许多预览版、alpha版、beta版甚至完整版。一方面,这很好,也是它如此出色的重要原因之一。开发人员能够提供输入并引导开发,使其成为微软开发的第一个由实际在前线构建Web应用程序的人设计的Web应用程序框架。
缺点是事物发生了很大的变化,并且仍在发生变化。不过,经过2.1版本之后,情况似乎已经平稳下来了,我认为这基本上是第一个真正完整的版本。然而,在我们到达这里之前,我们有ASP.NET vNext、ASP.NET MVC 6、DNX,然后是ASP.NET Core 1.0、1.1、2.0和最终的2.1 - 所有这些版本都至少从根本上改变了一些东西的工作方式。换句话说,即使您将搜索范围限制在ASP.NET Core上,也仍然存在很多过时和不正确的信息,简单地因为它是关于以前版本编写的,而且自那以后事情发生了变化。为了提高成功率,您应该考虑将搜索限制在去年(2018+,如果找不到更新的内容,则为2017)发布的内容中。任何早于此的内容,您都需要抱着非常谨慎的态度对待。
然后,这就带我们来到了Entity Framework。哦,我的天啊。EF有着传奇般的历史,其中大部分都充满了失败。原始的EF直到第3版才能使用。之前的版本非常糟糕,以至于在任何严肃的生产工作中都无法使用。即使到了EF 4,它也只是真正准备好进入主流时间,并开始在开发者中得到一些显著的应用。这也是Code First最终被引入的发布版本(技术上是4.1)。
在那之前,EF团队所说的Database First或Model First存在。唯一有意义的区别是一个可以从现有数据库生成模型,而另一个则可以让您设计模型,然后从中生成数据库。无论哪种情况,您最终都会得到一个名为EDMX的怪物,它试图跟上您的数据库状态以及VB/C#类的所有翻译。它是一个维护的噩梦,几乎从不正确地工作,并且是一个持续的挫败源。
Code First 提供了一种替代方案——在 EDMX 地狱中闪耀的光芒。您可以使用 POCO(普通旧类对象),EF 将能够从您对这些更改中生成迁移,以相应地更新您的数据库。它甚至可以用于处理现有数据库,尽管其名称阻止了它在该领域得到广泛使用(许多人错误地认为如果您拥有现有数据库,则必须继续使用旧的可怕的 Database First 方法)。事实上,Code First 是管理新旧数据库的完全替代方法。EF 5 和 EF 6 继续完善这种新方法,当开始开发 EF 7 时,微软决定是时候让 EDMX 去到它应得的坟墓了。
然而,EF 7的开发与ASP.NET Core的开发同时进行,后者衍生出了.NET Core和最终的.NET Standard。EF牢固地依赖于完整的.NET Framework,因此重写变得必要。因此,EF 7的开发被取消,EF Core应运而生。然而,EF Core经历了一段艰难的时期。ASP.NET Core像货车一样前进,但没有本地方法与数据库交互。你可以使用旧版EF,但那样你就不得不针对完整的.NET Framework,而非.NET Core。因此,EF Core被匆忙发布,1.0版本出现了巨大问题。基本功能缺失严重,解决方法也很繁琐,几乎没有人会在正常情况下将其用于生产。接着,1.1版本发布,虽然有所改进,但仍不够。2.0版本终于成为可用的ORM,您可以放心地在生产环境中使用。2.1版本的发布带来了更多的改进和完善。
现在你已经了解了历史,我只能说找到好的文档仍然有点靠运气。你需要非常具体地搜索,使用正确的术语(这也是我想给你讲历史的原因之一)。你还需要密切关注日期。请怀疑任何2017年之前存在的东西,即使是那一年的内容也要谨慎对待。官方文档是你最好的朋友。微软实际上在他们的文档和保持更新和准确方面做得非常出色。它涵盖了绝大多数的事情,是真相的最终来源。

在这里,书籍不会成为你的朋友。出版过程太长,而ASP.NET Core发展得太快了。任何一本关于Core的书籍一旦面世就已经过时了。然而,如果你订阅了Safari Books,由于它们的预发布和alpha版本,你可能会有好运气。你必须处理更多的技术错误、语法错误等,但至少信息会更接近实际情况。

Pluralsight有一些真正优秀的视频可以帮助你。不幸的是,视频制作与书籍出版有类似的问题,现在有不少课程已经过时到无用的地步。

希望这至少能给你提供更好的背景信息,并帮助改善你获取良好准确信息的能力。老实说,我自己也经常在这方面苦苦挣扎,我认为在这个领域工作的大多数开发人员都有同样的问题。这很有趣和令人兴奋,但也不是没有缺点。在海量信息中寻找一些珍珠就是其中之一。祝好运。


好的,谢谢。虽然您没有直接回答我的问题,但如果您告诉我可以在微软文档中找到它,那就让我放心了。 - Sreini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接