我已经阅读了有关 Code First Migrations 的信息,但似乎这并不适合企业。
我们有一个 DBA 来完成我们所有的数据库更改,我们不需要将这些更改放入类中并由应用程序执行数据库迁移。
如果我们更改我们的类和我们的 fluent API,然后让我们的 DBA 对数据库进行更改,那么我们如何同步到我们的 EF 模型?对于企业规模的应用程序,这通常是如何完成的?
我已经阅读了有关 Code First Migrations 的信息,但似乎这并不适合企业。
我们有一个 DBA 来完成我们所有的数据库更改,我们不需要将这些更改放入类中并由应用程序执行数据库迁移。
如果我们更改我们的类和我们的 fluent API,然后让我们的 DBA 对数据库进行更改,那么我们如何同步到我们的 EF 模型?对于企业规模的应用程序,这通常是如何完成的?
对我来说,这些其他答案似乎还不够。
您可以关闭 EF 初始化程序:
public ApplicationContext : DbContext
{
public ApplicationContext()
: base("ConnectionStringName")
{
Database.SetInitializer<ApplicationContext>(null);
}
// DbSets here
public DbSet<Part> Parts {get; set;}
// override OnModelCreating below ...
}
然后使用 Fluent API/数据注释,但是您通常会设置您的 POCO/模型以匹配现有数据库。
此博客的详细信息:http: //cpratt.co/entity-framework-code-first-with-existing-database/
万一该 URL 将来不起作用 - 这就是我的意思:
在上面设置了 Initializer 之后,配置与表对应的 POCO:
public class Part
{
public string PartID {get; set;}
public string Description {get; set;}
public decimal Weightlbs {get; set;}
public decimal Price {get; set;}
}
然后通过在您的类中覆盖此方法将您的 POCO 映射到现有的数据库表Application Context
:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Code First will assume a lot, but if you need to override things:
modelBuilder.Entity<Part>().ToTable("db_PartTable");
modelBuilder.Entity<Part>().Property(p => p.PartID)
.HasColumnName("Part_ID");
modelBuilder.Entity<Part>().Property(p => p.Description)
.HasMaxLength(100)
}
另一个很好的博客,由 Scott Guthrie 撰写:http ://weblogs.asp.net/scottgu/using-ef-code-first-with-an-existing-database
即使我使用 EF Code First 样式(与 EDMX 相对),我仍然在技术上使用数据库优先方法,因为我从不让 EF 为我生成数据库。相反,我创建类来为数据库建模。这听起来像你需要做的事情。
至于 DBA 改变的东西.. 你是否需要更新你的域实体类取决于 DBA 改变的是什么。例如,如果他正在增加 a varchar(100)
tovarchar(200)
或类似的长度,那么该更改不应真正破坏您的代码(但仍然建议您更新代码以匹配此内容)。如果他正在删除或重命名某些列,那么您肯定需要更新您的域实体类,因为这显然会导致底层模型不同步的异常。
回复有点晚,但这里有:
如果您使用 Visual Studio 的 EF Power Tools 扩展,它使您能够执行 Rowan Miller 所说的“代码第二”。看看这篇文章。
它可以让你指向一个现有的数据库,它会生成漂亮的 POCO 类,并且DbContext
就像你通过 Code First 完成它一样使用。没有更多ObjectContext
或edmx
文件。流畅的配置也为您完全生成。
展望未来,EF 团队将把这个功能整合到主要的 EF 工具中,这样您就不必下载 EF Power Tools 扩展。
通常在这种情况下人们使用数据库优先的方法。
当有人已经为您设计了数据库并且您可以通过几次点击生成或更新模型时,手动编写实体代码是没有意义的。当然,如果您的团队熟悉其他一些 ORM(其中它是主要方法)并且还不太熟悉 Entity Framework,或者如果您的团队非常小并且没有人可以编写 SQL 脚本,那么 Code First 可能会很方便,但是如果您有熟练的 DBA,为什么您需要 Code First?
只是对此添加一些想法-看看这两个帖子(我不久前发布的):
https ://stackoverflow.com/a/10164815/417747
https://stackoverflow.com/a/10255051/417747
简而言之,根据我的经验:
希望这个对你有帮助。
几天前我遇到了同样的问题,
旧数据库,__MigrationHistory 表是
在数据库中进行更改并在本地计算机上重新创建它
将当前创建数据库的 __MigrationHistory 表中的 ContextKey、Model 和 ProductVersion 添加到旧数据库的 __MigrationHistory 表中。
哦,不要忘记对旧数据库使用更改脚本。如需更多信息,请查看
http://www.codeproject.com/Tips/800936/Entity-Framework-code-first-migrations-alternative