【问题标题】:How to use the Procedure with User Defined Table Type in Entity Framework如何在实体框架中使用具有用户定义表类型的过程
【发布时间】:2014-01-25 02:49:56
【问题描述】:

如何在实体框架中使用用户定义表类型的过程?

我有数据库优先方法的 EF,当我添加一个包含用户定义表类型列的过程时,它不会反映在 EF 中,将更新模型。

以及如何通过过程传递EF中的用户定义表参数?

我的程序:

Sample_Proce_Sp ( @TableTest @UserDefinedTable 只读 ) 作为 开始 从@TableTest 中选择 * 结束

在 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. 

【问题讨论】:

    标签: entity-framework-6


    【解决方案1】:

    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”和“Address”都使用特殊属性定义。

    我有机会尝试一下..

        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',@GuidList=@p3
    

    这可能会完成工作,但 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

    【讨论】:

      猜你喜欢
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多