2013-12-21 110 views
17

我在當前項目中首先使用實體​​框架代碼。數據庫由許多表,許多視圖和許多功能組成。我能夠使用Entity Framework Code First創建表格。但我無法找到使用實體框架代碼優先來創建存儲過程的方法。我知道數據庫優先戰略將滿足我的要求,一切運作良好,但我不希望將數據庫優先策略用於我現有的項目代碼。使用實體框架代碼優先創建存儲過程?

請幫我一下,使用Entity Framework Code First策略創建存儲過程的最佳方法是什麼?

請幫我一下,謝謝。

+0

請看一看這個蘇答案:http://stackoverflow.com/a/7667777/68571 – VansFannel

回答

-3

在EF6中,您可以使用Code First創建存儲過程。看看這個article

+5

我通過給定了[文章](http://msdn.microsoft.com/en-us/data/dn468673)好像他們正在映射現有的存儲過程到實體。但我想**創建存儲過程**使用實體框架代碼的第一個策略(不要映射現有的存儲過程) – sridharnetha

+1

換句話說,所有存儲過程應創建時,從包管理器控制檯運行「更新數據庫-Verbose」命令。 – sridharnetha

+0

如果你正在使用遷移,那麼我認爲這是應該發生的。如果你正在使用初始化器,他們應該照顧相應地創建/更新數據庫。 – Pawel

11

隨着代碼首先,你總是進行遷移。遷移從DbMigration對象,它具有一個非常有用的方法繼承了:

DbMigration.Sql(字符串)

步驟如下:

1)從NuGet包管理器

打開包管理控制檯

2)類型添加遷移CreateHelloWorldStoredProcedureExample

3)在Visual Studio會告訴你有兩個空方法的新類:上下

4)在截至方法,編寫代碼,這裏有一個例子

public override void Up() 
{ 
     StringBuilder storedProcedureCode = new StringBuilder(); 

     storedProcedureCode.Append("CREATE PROCEDURE dbo.HelloWorld" + Environment.NewLine); 
     storedProcedureCode.Append("AS" + Environment.NewLine); 
     storedProcedureCode.Append("BEGIN" + Environment.NewLine); 
     storedProcedureCode.Append(@"SELECT 'Hello World'" + Environment.NewLine); 
     storedProcedureCode.Append("END" + Environment.NewLine); 

     this.Sql(storedProcedureCode.ToString()); 
} 

而在向下的方法:

public override void Down() 
    { 
     this.Sql("DROP PROCEDURE dbo.HelloWorld "); 
    } 

在此之後,只需運行更新數據庫,這就是它!

注意:如果您使用SQL Server,請避免使用GO語句。

+0

順便說一句,對不起,我的英語。所有更正都很好! –

+0

爲了搜索者的利益,這也適用於.NET Core(entityframworkcore)。這顯示了讓EF Core可以使用 - > https://github.com/aspnet/EntityFramework/issues/245的方式運行的另一種方式。然後你可以這樣調用它:var blogs = _context.Blogs。FromSql(「exec GetBlogForAuthorName @ p0」,「rod」); – HockeyJ

+0

一旦更新命令執行,我們就不能更新過程定義。 –

14

而不是使用StringBuilder的,你可以使用現有的EF方法

public override void Up() 
{ 
    CreateStoredProcedure(
    "MyStoredProcedure", 
    p => new 
    { 
     id = p.Int() 
    }, 
    @"SELECT some-data FROM my-table WHERE id = @id" 
); 
} 

public override void Down() 
{ 
    DropStoredProcedure("MyStoredProcedure"); 
} 
+2

爲了搜索者的利益,在撰寫本文時,這對於.NET Core(entityframworkcore)不起作用。 – HockeyJ

+0

好答案!!!我會編輯我的指向你的! –