情况如下:
我们有一个大型 MVC 项目,在 EF5.0 上采用数据库优先方法:
ObjectContext 构造函数:
namespace xxx.Models
{
(...)
public partial class xxxEntities : ObjectContext
{
#region Constructors
/// <summary>
/// (...)
/// </summary>
public xxxEntities() : base("name=xxxEntities", "xxxEntities")
{
this.ContextOptions.LazyLoadingEnabled = true;
OnContextCreated();
}
(...)
连接字符串:
<add name="xxxEntities"
connectionString="metadata=res://*/Models.xxxModel.csdl|
res://*/Models.xxxModel.ssdl|res://*/Models.xxxModel.msl;
provider=System.Data.SqlClient;provider connection string="
data source=.;Initial catalog=xxxdb;
integrated security=True;
multipleactiveresultsets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
我们选择 Code First 来测试分离命名空间上的新开发。
连接字符串:
<add name="xxxCFContext"
connectionString="Data Source=.;
Initial Catalog=xxxdb;
Integrated Security=True;
User Instance=False;
MultipleActiveResultSets=True"
providerName="System.Data.SqlClient" />
DbContext 构造函数:
namespace xxx.Models.CodeFirst
{
public partial class xxxCFContext : DbContext
{
static xxxCFContext()
{
Database.SetInitializer<xxxCFContext>(new ValidateDatabase<xxxCFContext>());
}
public xxxCFContext()
: base("Name=xxxCFContext")
{
}
(...)
我们运行 add-migrations,update-database 没有问题,构建成功完成。但是第一次使用代码优先的数据库访问:
xxxCFContext cfdb = new xxxCFContext();
foreach (Xobject xobject in cfdb.Xobjects)
出现错误:
“找不到概念模型类型 'xxx.models.yyyclass'”,但这个 yyyclass 存在于 edmx 中,而不是 codefirst 部分。
卸载EF5.0,安装EF6.0,错误消失。但我需要 EF5.0 而不是 6.0 alfa3 预发行版。
怎么了?我们如何在 EF5.0 中使用 edmx 与 codefirst 混合?
如果有任何想法,我将不胜感激。
编辑
我知道这种解决方法,但对我没有帮助:
有没有人将实体框架与代码优先方法与 Edmx 文件混合使用?
http://blog.oneunicorn.com/2012/02/26/dont-use-code-first-by-mistake/
http://blog.oneunicorn.com/2012/02/26/dont-use-code-first-by-mistake/
实体框架(4.3)寻找单数而不是复数(当实体名称以“s”结尾时)
使用 Database First 和 Entity Framework 4.1 构建 MVC 3 应用程序
生成(使用 xxxmodel.Context.tt 和 xxxModel.tt)大型现有 edmx 的问题大量利用了 ObjectContext 的优势,因此我们不能简单地从 ObjectContext 更改为 DbContext(在现有 edmx 之后)。
编辑二
从 DB First 到 CodeFirst,我们选择以下:
- 从旧的 edmx 文件移至代码生成。使用EF 5.x DbContext Fluent Generator生成了模型对象,因此我们有了模型对象。
(右击 EDMX 编辑器,添加代码生成项。如果没有,请安装:工具菜单、扩展和更新、EF 5.x DbContext Fluent Generator)
- 模型对象和上下文是从 EDMX 复制的。
- EDMX 被删除了他手下的任何东西。
- 将 ConnectionString 从困难的 EDMX 样式设置为简单的 codefirst 形式。
tadam,在大约 10 分钟内,我们从 Database First 转移到 Code First。在开发过程中,数据库中有 80 个表。
在电源管理控制台中运行 Enable-Migrations,然后继续使用 CodeFirst。