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

 渊博的效力 发布于 2023-02-06 09:00

如何在Entity Framework中使用具有用户定义的表类型的过程?

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

如何在程序中传递EF中用户定义的表参数?

我的程序:

Sample_Proce_Sp(@TableTest @UserDefinedTable Readonly)AS BEgin 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. 

TheDev6.. 10

Github上的EntityFrameworkExtras看起来很有希望.

来自Git中心站点:

DbContext context = new DbContext("ConnectionString");

var proc = new AddMemberStoredWithAddressesProcedure()
    {
        FirstName = "Michael",
        LastName = "Bovis",
        Age = 26,
        Addresses = new List
() { 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();
        }
    }

凉!我说这个库是一个有效的选择.

更新:

来自我博客的更多信息

Visual Studio项目示例

1 个回答
  • Github上的EntityFrameworkExtras看起来很有希望.

    来自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();
            }
        }
    

    凉!我说这个库是一个有效的选择.

    更新:

    来自我博客的更多信息

    Visual Studio项目示例

    2023-02-06 09:02 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有