4

情况如下:

我们有一个大型 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=&quot;
         data source=.;Initial catalog=xxxdb;
         integrated security=True;
         multipleactiveresultsets=True;
         App=EntityFramework&quot;"
         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 复制的。
  • EDMX 被删除了他手下的任何东西。
  • 将 ConnectionString 从困难的 EDMX 样式设置为简单的 codefirst 形式。
  • tadam,在大约 10 分钟内,我们从 Database First 转移到 Code First。在开发过程中,数据库中有 80 个表。

  • 在电源管理控制台中运行 Enable-Migrations,然后继续使用 CodeFirst。

4

1 回答 1

2

将 EF 的不同“类型”(代码优先、数据库优先等)保存在单独的程序集中可能会有所帮助:EF 的一个限制是它不可能在具有某些数据库优先属性的程序集中使用代码优先- 虽然较新版本的 EF 可能会解决此问题(也许这就是 EF6 alpha 适合您的原因)。

于 2013-03-07T10:03:16.473 回答