use*_*161 44 c# code-first entity-framework-4.1 ef-migrations
实体框架4.1 Code First非常适合创建表和关系.是否可以使用Code first方法创建sql视图或存储过程?任何关于此的指示都将受到高度赞赏.非常感谢!
Car*_*l G 87
我们在实体框架代码优先迁移中支持存储过程.我们的方法是创建一些文件夹来保存.sql文件(例如〜/ Sql /).在文件夹中创建.sql文件,以便创建和删除存储过程.例如Create_sp_DoSomething.sql和Drop_sp_DoSomething.由于SQL在批处理中运行并且CREATE PROCEDURE..必须是批处理中CREATE PROCEDURE...的第一个语句,因此请在文件中创建第一个语句.另外,不要放在GO后DROP....如果您还没有资源文件,请将资源文件添加到项目中.将.sql文件从解决方案资源管理器拖到Resources设计器的Files视图中.现在创建一个空的migration(Add-Migration SomethingMeaningful_sp_DoSomething)并使用:
namespace MyApplication.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class SomethingMeaningful_sp_DoSomething : DbMigration
{
public override void Up()
{
this.Sql(Properties.Resources.Create_sp_DoSomething);
}
public override void Down()
{
this.Sql(Properties.Resources.Drop_sp_DoSomething);
}
}
}
Run Code Online (Sandbox Code Playgroud)
〜/ SQL/Create_sp_DoSomething.sql
CREATE PROCEDURE [dbo].[sp_DoSomething] AS
BEGIN TRANSACTION
-- Your stored procedure here
COMMIT TRANSACTION
GO
Run Code Online (Sandbox Code Playgroud)
〜/ SQL/Drop_sp_DoSomething.sql
DROP PROCEDURE [dbo].[sp_DoSomething]
Run Code Online (Sandbox Code Playgroud)
emp*_*emp 25
乍一看,我真的很喜欢Carl G的方法,但它涉及很多手动交互.在我的场景中,我总是删除所有存储过程,视图......并在数据库发生更改时重新创建它们.通过这种方式,我们确信所有内容都是最新版本的最新版本.
通过设置以下初始化程序进行重新创建:
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
Run Code Online (Sandbox Code Playgroud)
然后,只要准备好迁移,我们的种子方法就会被调用
protected override void Seed(DeploymentLoggingContext context)
{
// Delete all stored procs, views
foreach (var file in Directory.GetFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Sql\\Seed"), "*.sql"))
{
context.Database.ExecuteSqlCommand(File.ReadAllText(file), new object[0]);
}
// Add Stored Procedures
foreach (var file in Directory.GetFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Sql\\StoredProcs"), "*.sql"))
{
context.Database.ExecuteSqlCommand(File.ReadAllText(file), new object[0]);
}
}
Run Code Online (Sandbox Code Playgroud)
SQL语句存储在*.sql文件中以便于编辑.确保您的文件将"构建操作"设置为"内容",将"复制到输出目录"设置为"始终复制".我们查找文件夹并执行里面的所有脚本.不要忘记在SQL中排除"GO"语句,因为它们无法使用ExecuteSqlCommand()执行.
我当前的目录布局如下:
Project.DAL
+ Migrations
+ Sql
++ Seed
+++ dbo.cleanDb.sql
++ StoredProcs
+++ dbo.sp_GetSomething.sql
现在你只需要在文件夹中删除额外的存储过程,一切都会得到适当的更新.
Jon*_*der 13
为了扩展bbodenmiller的答案,在实体框架6中,DbMigration类具有诸如AlterStoredProcedure之类的方法,这些方法允许修改存储过程,而不必一直下降到原始SQL.
下面是一个的例子Up(),其改变名为EditItem现有SQL Server存储的过程,它采用类型的三个参数迁移方法int,nvarchar(50)以及smallmoney分别:
public partial class MyCustomMigration : DbMigration
{
public override void Up()
{
this.AlterStoredProcedure("dbo.EditItem", c => new
{
ItemID = c.Int(),
ItemName = c.String(maxLength:50),
ItemCost = c.Decimal(precision: 10, scale: 4, storeType: "smallmoney")
}, @" (Stored procedure body SQL goes here) "
}
//...
}
Run Code Online (Sandbox Code Playgroud)
在我的机器上,此迁移脚本生成以下SQL:
ALTER PROCEDURE [dbo].[EditItem]
@ItemID [int],
@ItemName [nvarchar](50),
@ItemCost [smallmoney]
AS
BEGIN
(Stored procedure body SQL goes here)
END
Run Code Online (Sandbox Code Playgroud)
bbo*_*ler 11
它看起来很难记录,但是看起来你现在可以使用实体框架6中的AlterStoredProcedure,CreateStoredProcedure,DropStoredProcedure,MoveStoredProcedure,RenameStoredProcedure进行一些存储过程操作.我还没有尝试过它们所以还不能举一个例子来说明如何使用它们.
Lad*_*nka 10
EF代码优先方法期望数据库中没有逻辑.这意味着没有存储过程,也没有数据库视图.因为代码优先方法没有提供任何机制来自动生成这样的结构.如果它意味着生成逻辑,它怎么能这样做呢?
您必须通过手动执行创建脚本在自定义数据库初始化程序中创建它们.我不认为SQL迁移可以处理这种自定义SQL构造.