首先在实体框架5模型中,由于类文件的生成方式,似乎出现了一些突破性的变化(不再生成代码,而是T4模板)
2个例子:
- 生成的上下文文件不再实现IDisposable
- 再也没有一个构造函数接受连接字符串了
是否有更多突破性的变化?他们的解决方案是什么?
从Entity Framework 5中的模型生成的默认代码现在继承DbContext而不是ObjectContext。
这仍然实现了IDisposable,但如果你从一行类似的代码中得到错误:
using (var mymodel = new MyModelContext()) { ... }
抱怨没有实现IDisposable,那么您的问题很可能是您的模型是在引用EF5的单独程序集中定义的,并且您没有向项目添加EF5引用。
正如Ladislav Mrnka在他的回答中已经提到的那样,如果你想将连接字符串传递给构造函数,你必须手动创建自己的构造函数。
如果你想将实体框架切换回旧风格的生成代码,这将自动生成你想要的构造函数,那么请遵循以下步骤:
- 单击EDMX文件的设计器表面,然后查看属性窗口。找到一个名为"代码生成策略"的属性,并将其设置为"默认"而不是"无"。这将告诉Visual Studio开始在一个大文件中的MyModel.Designer.cs中为您的对象模型创建代码,这次使用ObjectContext而不是DbContext
- 从EDMX文件下面删除以下子文件:MyModel.Context.tt、MyModel.tt。这些是您不再需要的自动生成的文件。如果您不删除它们,您将得到类命名冲突,因为您的对象将被创建两次
生成的上下文文件不再实现IDisposable
IDisposable
仍然由父上下文类型实现。生成的类型仍然是一次性的。
没有一个构造函数再接受连接字符串
它现在使用约定来获取连接字符串,但您可以将自己的构造函数添加到模板或上下文的分部类部分。
还有更多突破性的变化吗?他们的解决方案是什么?
这是一个突破性的变化,因为它使用了不同的API-DbContext API,而不是ObjectContext API,这意味着不同的类型、不同的方法、POCO实体等。如果要返回到原始代码生成,则必须删除这些T4模板并启用代码生成,如.Designer.cs文件中所述,但当前推荐的方法是使用POCO和DbContext API。
我遇到了同样的问题,using语句需要一个扩展IDisposable的类型。。。结果发现我忘记在项目中引用System.Data.Entity。。。添加了引用并解决了问题。
只需清理和构建项目,不要忘记添加对实体的引用。