2013-03-04 157 views
3

我使用实体框架与代码优先(主要是因为与RIA服务,您需要具有某种形式的代码类的任何其他属性)。从实体框架代码优先的模型生成数据库脚本

我想获得一个数据库生成脚本来轻松更新Visual Studio数据库项目。我不想使用ef迁移,我更喜欢数据库项目。

我可以使用类似

string sqlscript = (context as IObjectContextAdapter).ObjectContext.CreateDatabaseScript(); 

在运行时间,但我希望有一个方便的方法来获得脚本,而不运行该项目以某种方式,而不使用迁移。

有没有人有任何想法?

我在不同的项目中使用ef4.1和ef5。

[编辑:在回答这个问题将是一个远远高于从包管理器控制台线路调用方式]

+0

迁移是在设计时创建的SQL脚本工具。目前,EF代码首先与VS中的数据库项目没有整合。我会说你的工作流程使用了错误的方向。对于数据库项目,您应该从数据库定义开始,构建数据库并从数据库生成类。你的方向不被支持 - 至少正式,我怀疑它会很快。 – 2013-03-05 08:54:58

+0

@LadislavMrnka我不是在寻找任何整合。我只想要数据库生成脚本,即什么来自“ObjectContext.CreateDatabase”。 我只使用数据库项目来生成更新脚本 - 基本上就像迁移一样。我之所以不使用代码优先的迁移,是因为我怀疑它们比数据库项目更不成熟,功能更完备。 – John 2013-03-05 11:38:37

回答

4

的方法之一是使用实体框架电动工具。他们为包含DbContext类的文件添加一个上下文菜单项,该类为数据库生成一个DDL文件。

另一种方法是使用LinqPad。因为它们需要第三方工具

(this as IObjectContextAdapter).ObjectContext.CreateDatabaseScript() 

两种方式都是稍显不便,但:在LinqPad打开DLL后,可以在查询执行中的问题给出的代码片段。

+1

只要你知道,你不需要linqPad。你可以用上面的语句写一个简单的cmdline工具,或者使用你的单元测试运行器输出结果。 – 2013-05-16 22:09:59

+0

upvote for EF PowerTools建议 – 2013-12-08 11:39:30

1

您还可以使用ObjectQuery类生成自定义查询。 下面是一个例子:

var query = from emp in context.Employees 
      select emp; 

var sqlScript = ((ObjectQuery)query).ToTraceString(); 
1

你可以考虑的一个方法是使用EF迁移来生成脚本,然后使用的MSBuild后生成的任务超过在构建时复制脚本到数据库项目。

3

我已经启用迁移,但我总是做得到在运行脚本,而不使用程序包管理器控制台,因为我有,只能在运行时根据包括在什么项目参考文献中发现的动态实体来更新数据库。

的代码拿到剧本是这样的:

var config = new DbMigrationsConfiguration<MyContext> { AutomaticMigrationsEnabled = true }; 
var migrator = new DbMigrator(config); 
var scriptor = new MigratorScriptingDecorator(migrator); 
string script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null);