使用 Entity Framework 6.1 和 MVC 5 从数据库中使用 Code First 后如何同步模型?

Posted

技术标签:

【中文标题】使用 Entity Framework 6.1 和 MVC 5 从数据库中使用 Code First 后如何同步模型?【英文标题】:How to sync model after using Code First from Database using Entity Framework 6.1 and MVC 5? 【发布时间】:2014-05-03 11:01:33 【问题描述】:

假设

使用 EF 6.1、MVC 5、VS 2013、C#

我有一个在 Toad DM 中为 SQL Server 设计的现有数据库模型,保持更新非常重要

步骤和注意事项

    使用 ADO.NET 实体数据模型我选择 Code First from DatabaseEF 6.1 中的新功能)来生成模型。注意:模型类和 DbContext 类生成成功,但没有生成 .edmx 或 .tt 文件

    接下来我添加了一个新的脚手架项目:MVC 5 Controllers with views, using Entity Framework。注意:成功,控制器和视图生成

问题

从现在开始,我不想使用 Code First 来更新我的数据库。相反,我希望根据数据库更改更新模型。接下来做什么?如果我没有 edmx 文件,我将无法从数据库更新我的模型类吗?

【问题讨论】:

没有创建 EDMX,因为这是用于数据库/模型优先开发 - 您的选择是调整映射文件和数据库,或者使用 Code First 迁移。 好的,但是如果我没有 edmx 文件,我将无法从数据库更新我的模型类? 虽然理论上您可以反复使用“数据库中的代码优先”工具重新生成所有类,但首先使用 Code First 是一个慎重的选择,以便将您的代码用作架构的主要方法改变。如果进行迁移不符合您的开发风格,我建议将方法切换到最适合的方法。 (数据库优先) 当然,我明白了。我已经从数据库切换到 EF 设计器,问题就解决了。谢谢丹斯。所以,我相信我的问题的答案是否定的,如果我没有 edmx 文件,我将无法从数据库更新我的模型类,因为在 Code First 方法中没有生成 edmx 文件。对吗? 这是我的理解,是的。祝你好运! 【参考方案1】:

数据库中的实体数据模型向导的 Code First 非常出色地创建了您的实体类,就好像它们是以 Code First 样式创建的一样。您要问的是,是否有任何方法可以使这些类在您的数据库更改时保持最新,类似于 EDMX 样式“从数据库更新模型”。根据我的研究,使用内置工具不可能。但是,这是我发现有用的一种解决方法:

假设我有一个包含产品表和客户表的数据库。最初我创建了一个 StoreDBContext 类,并选择产品作为我的对象之一。现在我想将客户表作为新实体添加到现有上下文中。以下是使用 Code First 向导执行此操作的方法:

    创建一个新的实体数据模型,将其命名为 StoreDBContextTemp 或其他 先从数据库向导选项中选择代码 选择客户作为要添加的对象(仅客户)并完成向导 打开新创建的上下文文件StoreDBContextTemp.cs,并复制新添加实体的虚拟属性:

public virtual DbSet<Customer> Customers get; set;

    将这些新属性粘贴到您的原始 StoreDBContext.cs dbcontext 类中。 删除StoreDBContextTemp.cs,并删除app.config/web.confg等中StoreDBContextTemp的连接字符串。 您现在可以在 StoreDBContext 类上使用 Customer

如果您添加或删除表,您将需要手动调整字段,但至少您不需要在每次将新表添加到模型时手写几十个属性。

【讨论】:

这是一个很好的解决方法。我也在使用它。但是,我想知道微软在想什么。由于在不同国家工作的不同团队(数据库团队和开发团队),有许多公司无法使用迁移。我真的希望他们能在EDMX 文件中找到Update Model From Database 的替代方案,尽管这不太可能。 不错的解决方法!但是,我没有手动添加新的 DbSet,而是在开始执行上述步骤之前完全删除了上下文文件,以便我使用原始数据库上下文名称作为新模型名称,并自动为我创建所有数据库集。我建议从 VS 创建的上下文文件中删除自定义内容并将其放入相应的部分上下文数据库文件中。 构建一个可以为您处理此问题的工具似乎是个好主意。【参考方案2】:

另一种选择是从项目中删除自动生成的类并再次生成它们。 虽然遵循这种方法,但我们只需要确保我们应该为数据模型(继承自 DbContext 的类名)提供与前一个相同的名称。数据模型名称在下面的快照中突出显示

【讨论】:

【参考方案3】:

三件事。

    使用 Code First 时没有 .edmx。

    如果您使用 Code First 迁移,您必须先编写代码,然后再将更改迁移到数据库。这有助于您在没有生成代码的情况下更有条理地编写代码,这是一个优势。

    Visual Studio 中有一个插件可以做相反的事情。 Entity Framework PowerTools 允许您选择数据库并将其映射到对象。

https://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d

【讨论】:

【参考方案4】:

对我来说最好的解决方案是删除模型并重新创建具有相同名称的更新模型,记住两点:

    为模型实现的个人扩展方法; 由于未在物理数据库中设置,添加到模型中的表之间可能存在手动关系。

我的个人解决方案:

    将所有扩展方法移动到另一个不会被覆盖的部分类; 将实体的所有添加属性插入另一个分部类; 在帮助文件中跟踪所有手动关系,以便您可以再次添加它们,确保不会丢失任何东西; 删除旧模型并重新创建一个具有相同名称的新模型,并使用第 3 点的手动关系对其进行更新。

【讨论】:

以上是关于使用 Entity Framework 6.1 和 MVC 5 从数据库中使用 Code First 后如何同步模型?的主要内容,如果未能解决你的问题,请参考以下文章

在 Entity Framework 6.1(非核心)中,如何使用 IndexAttribute 来定义聚集索引?

如何在 Entity Framework 6.1 中仅加载子对象的某些字段?

如何将针对 Entity Framework .Net 4.6.1 的库与 .Net Core 应用程序一起使用

linq to sql 鍜?entity framework 杈撳嚭sql璇彞

csharp 使用Entity Framework和OracleParameters执行查询

使用 Entity Framework 添加和更新实体