2014-01-07 28 views
4

如何在實體框架中使用具有用戶定義表類型的過程?如何在實體框架中使用用戶定義表類型的過程

我有EF用數據庫優先的方法,當我添加一個用戶定義的表類型的過程列它不會反映在EF將更新模型。

我怎樣才能在程序中傳遞用戶自定義的表格參數?

我的方法:

Sample_Proce_Sp ( @TableTest @UserDefinedTable只讀 ) AS 開始 SELECT * FROM @TableTest END

在EF我已經更新了模型,將增加存儲程序顯示錯誤如

The model was generated with warnings or errors. 
Please see the Error List for more details. These issues must be fixed before running your application. 
Loading metadata from the database took 00:00:03.1330217. 
Generating the model took 00:00:01.9251464. 
Successfully registered the assembly 'System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' in the Web.Config file. 

回答

7

EntityFrameworkExtras on Github看起來很有希望。

從Git的樞紐站點:

DbContext context = new DbContext("ConnectionString"); 

var proc = new AddMemberStoredWithAddressesProcedure() 
    { 
     FirstName = "Michael", 
     LastName = "Bovis", 
     Age = 26, 
     Addresses = new List<Address>() 
     { 
      new Address() {Line1 = "16", Line2 = "The Lane", Postcode = "MA24WE"} 
     } 
    }; 

context.Database.ExecuteStoredProcedure(proc); 

其中 「AddMemberStoredWithAddressesProcedure」 和 「地址」 都具有特殊屬性的定義。

我有機會嘗試一下..

CREATE TYPE [dbo].[UdtGuidList] AS TABLE(
     [Guid] [uniqueidentifier] NULL 
    ) 
GO 

CREATE PROCEDURE [dbo].[MyUdtSproc] 
    -- Add the parameters for the stored procedure here 
    (@GuidList UdtGuidList READONLY) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    SELECT * 
    from Blog b 
    INNER JOIN @GuidList gl ON gl.Guid = b.BlogGuid 
    --where b.BlogGuid in (SELECT gl.Guid from @GuidList gl) 

END 

它創建了5行的自定義類型的這種動態SQL ..

declare @p3 dbo.UdtGuidList 
insert into @p3 values(N'333f3916-c823-e311-84f2-0022198ef787') 
insert into @p3 values(N'33327a17-c34e-e211-9a8c-0022198ef787') 
insert into @p3 values(N'333ebc24-c44e-e211-9a8c-0022198ef787') 
insert into @p3 values(N'3338d557-c44e-e211-9a8c-0022198ef787') 
insert into @p3 values(N'333d7f92-c44e-e211-9a8c-0022198ef787') 

exec sp_executesql N'EXEC [dbo].[MyUdtSproc] @GuidList = @GuidList ',N'@GuidList [UdtGuidList] READONLY',@[email protected] 

這可能完成工作,但在用戶定義的表中,sql可能會增長很多行。我打算將它與舊的ADO進行比較。

我嘗試了舊的DataTable ADO(下面)並跟蹤了SQL以查看它產生了什麼。這完全一樣!

var dt = new DataTable(); 

    dt.Columns.Add("Guid"); 

    foreach (var r in list) 
    { 
     var row = dt.NewRow(); 
     row["Guid"] = r.Guid; 
     dt.Rows.Add(row); 
    } 

    using (var conn = new SqlConnection(@"Server=AComputer\DEVSQL;Database=Booyaa;Trusted_Connection=True")) 
    { 
     using (var sproc = new SqlCommand("[dbo].[MyUdtSproc]", conn)) 
     { 
      var param = new SqlParameter("@GuidList", SqlDbType.Structured); 
      param.TypeName = "[dbo].[UdtGuidList]"; 
      param.SqlValue = dt; 
      sproc.Parameters.Add(param); 

      if (conn.State != ConnectionState.Open) conn.Open(); 
      var reader = sproc.ExecuteReader(); 
     } 
    } 

很酷!我說這個圖書館是一個有效的選擇。

更新:

More information from my blog

A Sample Visual Studio Project

相關問題