繁体   English   中英

使用 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?

假设

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

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

步骤和注意事项

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

  2. 接下来我添加了一个新的脚手架项目:MVC 5 Controllers with views,使用实体框架。 注意:成功,生成控制器和视图

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

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

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

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

public virtual DbSet<Customer> Customers {get; set;}

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

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

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

数据模型名称

三件事。

  1. 使用 Code First 时没有 .edmx。

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

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

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

还有一件事要添加到Brian Vander Plaats的回答中。 在步骤4中,您还需要复制新StoreDBContextTemp.cs / OnModelCreating方法中的任何内容,并将其添加到现有的StoreDBContext.cs / OnModelCreating中。 否则,在删除新的上下文类时,您将丢失这些配置。

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

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

我个人的解决方案:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM