entity-framework - EDMX 用于遗留代码 _and_ Code First 用于在一个 MVC 项目中一起进行新开发

标签 entity-framework ef-code-first edmx

情况如下:

我们在 EF5.0 上有一个使用数据库优先方法的大型 MVC 项目:

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 预发行版。

怎么了?我们如何将 edmx 与 codefirst 与 EF5.0 混合使用?

如果有任何想法,我将不胜感激。

编辑

我知道这种解决方法,但对我没有帮助:

Have anyone used Entity Framework with code first approach mixed with Edmx file?

http://blog.oneunicorn.com/2012/02/26/dont-use-code-first-by-mistake/

Could not find the conceptual model type

http://blog.oneunicorn.com/2012/02/26/dont-use-code-first-by-mistake/

Entity Framework (4.3) looking for singular name instead of plural (when entity name ends with "s")

Building an MVC 3 App with Database First and Entity Framework 4.1

生成(用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)
    enter image description here
  • 模型对象和上下文是从 EDMX 复制的。
  • EDMX 删除了他下面的任何内容。
  • 将 ConnectionString 从困难的 EDMX 样式设置为简单的 codefirst 形式。
  • 最后,在大约 10 分钟内,我们从数据库优先转向了代码优先。在开发过程中,数据库中有 80 个表。
  • 在电源管理控制台中运行 Enable-Migrations,然后继续使用 CodeFirst。
  • 最佳答案

    在单独的程序集中保留不同“类型”的 EF(代码优先、数据库优先等)可能会有所帮助:EF is that it is not possible use code-first in an assembly with certain database-first attributes 的限制- 尽管较新版本的 EF 可能会解决此问题(也许这就是 EF6 alpha 适合您的原因)。

    关于entity-framework - EDMX 用于遗留代码 _and_ Code First 用于在一个 MVC 项目中一起进行新开发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15268036/

    相关文章:

    c# - 在配置文件中设置 DatabaseInitializerForType 以触发自定义初始化程序

    c# - 错误 : "The specified LINQ expression contains references to queries that are associated with different contexts"

    c# - EF 递归层次结构

    c# - DbContext 的 ObjectContext.ApplyCurrentValues 的等价物是什么

    c# - EF6 Code First 具有通用存储库和依赖注入(inject)和 SoC

    sql-server - 使用 StartsWith 过滤时 EF 不使用 SQL 索引

    entity-framework - 更新数据库已过时 - Visual Studio 2015 Update 3

    .net - 使用更新的值在 Entity Framework 上下文中重新加载对象

    .net - 创建 Entity Framework DbContext 时如何将现有模型 "attach"到现有 DbConnection?

    c# - 由于关键字为 "using"的未知命名空间,运行转换失败