我在.Net MVC(v4.5)中教授一个基本的编程类,它要求他们使用SQL Server作为后端和EF5。为了简化问题,我让学生使用数据库第一代代码生成。问题是,他们经常遇到与移动解决方案,共享代码以及将数据库从本地更改为远程(Azure)相关的问题。这会导致更改上下文类名称或连接字符串(或两者),从而导致各种问题,如您所能想象的那样。
虽然我可以与每个学生一起工作并解决他们的问题并且已经多次解释代码以及更改的后果,但这非常耗时。
知道这应该是一个入门课程,我不愿意过多地讲授接口和抽象,我甚至不确定这会解决他们的问题。其他想法是自己做这项工作来创建界面,让他们使用它。或者,可能最简单的是,每次创建新解决方案时都要求他们使用相同的名称(我已经强调过)。
公平地说,并不是所有的学生都有这些问题,但在课堂上,“squeaky wheel”综合症仍然存在且很好,并且需要花费太多的个人时间来保持阅读。
冒这个问题太宽泛的风险,有没有人知道我可以让他们实现的模式或技术,以避免因更改而引起的上下文或连接字符串命名问题?
答案 0 :(得分:2)
好吧,不要在这里过于挑剔,但如果你没有让他们依赖Database First,那么问题就会缓解。对于新老开发者而言,EDMX垃圾是一个长期存在的问题。这可能是EF团队犯下的最大错误之一。值得庆幸的是,他们已经努力纠正这一点。 Code First是在EF 4.1中引入的,以提供更好的方法,现在,EF 6实际上是支持EDMX的最后一个版本,包括Database First和Model First模式,因为两者都已被弃用。
问题在于Code First的命名与现有的Database First和Model First模式相矛盾,但是尽管名称如此,除了创建之外,始终能够使用现有的数据库新的。如果您有兴趣,可以examples。关键在于,如果你的目标是让你的学生首先设计一个数据库,这并不妨碍仍然使用Code First,事实上,你通过教他们使用方法来帮助你的学生伤害他们相反,不推荐使用。
答案 1 :(得分:0)
这会导致更改上下文类名称或连接字符串(或两者),从而导致各种问题,如您所能想象的那样。
一个简单的解决方法是在这里解释两件事:
他们应该知道,为了实例化一个对象,他们需要知道它的类型名称。因此无论他们称他们的DbContext派生类,他们都应该注意这个名称,并确保其余的代码使用它。
因此,如果他们将其命名为Net101Databases
或MyCoolFirstDbContext
,则必须强调他们使用using (var context = new
TheirContextName()
{{1}为了能够使用它。
其次,您可以轻松添加一个构造函数重载,该重载接受连接字符串名称并将其传递给基类:
)
现在他们可以使用在配置中找到的连接字符串名称来实例化它:
public ApplicationContext(string nameOrConnectionString)
: base(nameOrConnectionString)
{ }