我应该在哪个层使用EF 5.0为包含表值参数的存储过程创建Sql参数

时间:2014-01-08 07:32:43

标签: c# entity-framework stored-procedures table-valued-parameters

我在项目中创建了一个数据访问层(DAL),我正在使用Entity framework5进行CRUD操作。我还在我的数据访问层中实现了存储库和工作单元格。

现在我想出了一种情况,我必须执行一个存储过程,它需要一个表值参数作为输入。如何编写泛型函数以及DAL中哪个类使用任何类型的参数执行任何存储过程?我不想在我的业务层创建硬编码SqlParameters。

目前我已在我的工作单位中硬编码此功能。

public void ExecuteSqlCommand(string command, params object[] parameters)
        {
            DataTable dataTable = new DataTable();

            dataTable.Columns.Add(new DataColumn("ProductId"));
            dataTable.Columns.Add(new DataColumn("IsListed"));
            dataTable.Columns.Add(new DataColumn("WasEverListed"));
            dataTable.Columns.Add(new DataColumn("MarketplaceItemNumber"));

            SqlParameter param = new SqlParameter("@tvpProductIsListed", SqlDbType.Structured);
            param.SqlValue = dataTable;
            param.TypeName = "dbo.ProductIsListedTableType";

            int ret = dbContext.Database.ExecuteSqlCommand("EXEC " + command + " @tvpProductIsListed, @RetailerId, @BrandId, @MarketplaceId",
                param,
                new SqlParameter("@RetailerId", 1),
                new SqlParameter("@BrandId", 1),
                new SqlParameter("@MarketplaceId", 1));           
        } 

在这个问题上,我们将非常感谢帮助!

1 个答案:

答案 0 :(得分:1)

退后一步。决定是否要让EF为您执行所有数据库CRUD - 对于单个实体来说它是相当擅长的,还是您自己做的?此外,尝试写一些通用的东西很难。在通用的某个地方你需要做某种" IF"测试

最好的方法是让一个组件处理某个特定事物,并将其中许多组件用于特定事物 - 如果您突然发现需要在泛化中出现偏差,则更容易修复。我也不会在代码中嵌入sql脚本 - 让数据库引擎处理它。

因此,我将拥有一个包含Get,GetList,Insert,Update,Delete方法的自定义存储库。插入和更新将采用给定类型的实体,然后您需要具有允许您执行到/从实体映射到表类型的内容,然后可以将其传递到存储过程。此外,所有方法都返回数据和错误处理状态。