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

gka*_*aio 57 c# ef-code-first ef-database-first entity-framework-6 asp.net-mvc-5

假设

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

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

步骤和笔记

  1. 使用ADO.NET实体数据模型我从数据库中选择Code First(EF 6.1中的新功能)来生成模型.注意:模型类和DbContext类成功生成但生成了NO .edmx或.tt文件.

  2. 接下来,我使用Entity Framework添加了一个新的脚手架项:带有视图的MVC 5控制器.注意:生成成功,控制器和视图

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

Bri*_*ats 51

实体数据模型向导的数据库中的Code First在创建实体类方面表现非常出色,就像它们是以Code First风格创建的一样.您要问的是,如果您的数据库发生更改,是否有任何方法可以使这些类保持最新,类似于EDMX样式"从数据库更新模型".从我研究过,这是使用内置的工具可能.但是,这是我发现有用的一种解决方法:

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

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

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

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

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

  • 这是一个很好的解决方法.我也在使用它.但是,我想知道微软在想什么.有许多公司因为在不同国家(数据库团队和开发团队)工作的不同团队而无法使用迁移.我真的希望他们能够在`EDMX`文件中提出"从数据库更新模型"的替代方案,尽管它不太可能. (3认同)

Raj*_*wde 8

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

数据模型名称


Gab*_*ada 5

三件事。

  1. 当您使用 Code First 时,没有 .edmx。

  2. 如果您使用“代码优先迁移”,则必须先编写代码,然后将更改迁移到数据库。这可以帮助您使代码更有条理,而无需生成代码,这是一个优势。

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

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