Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 从EF6/MVC5中包含多个查询的存储过程返回数据_Entity Framework_Stored Procedures_Asp.net Mvc 5 - Fatal编程技术网

Entity framework 从EF6/MVC5中包含多个查询的存储过程返回数据

Entity framework 从EF6/MVC5中包含多个查询的存储过程返回数据,entity-framework,stored-procedures,asp.net-mvc-5,Entity Framework,Stored Procedures,Asp.net Mvc 5,如果我有一个存储过程,其中包含多个使用不同“操作”调用的查询,那么EF似乎无法找到所有查询并生成反映它们的复杂类型。看起来它只是接受了在存储过程中找到的第一个查询,并创建了结果类型,以适应只包含3个字段的查询 @Action VARCHAR(20) = Null, @ID INT = Null, @Username VARCHAR(50) = Null, @Description VARCHAR(200) = Null, @Account VARCHAR(20) = NULL, @BranchC

如果我有一个存储过程,其中包含多个使用不同“操作”调用的查询,那么EF似乎无法找到所有查询并生成反映它们的复杂类型。看起来它只是接受了在存储过程中找到的第一个查询,并创建了结果类型,以适应只包含3个字段的查询

@Action VARCHAR(20) = Null,
@ID INT = Null,
@Username VARCHAR(50) = Null,
@Description VARCHAR(200) = Null,
@Account VARCHAR(20) = NULL,
@BranchCode SMALLINT = NULL,
@Receipt BIT = NULL,
@BackDate DATETIME = NULL,
@GetDate DATETIME = NULL,
@AccountID CHAR(16) = NULL,
@StatementDate DATETIME = NULL
as

Set @GetDate = Convert(Datetime,Convert(Varchar(10), GetDate(), 101))

IF @Action = 'GetStatements'
BEGIN
   SELECT DISTINCT [AccountID], [CardHolderName], [StatementDate]
   FROM CorpCardTransactions
   WHERE username = @username + '@xxxxxxxx.com'
   ORDER BY StatementDate
END

IF @Action = 'EmpSubmitTransactions'
BEGIN
   UPDATE CorpCardTransactions
   SET [Description] = @Description, [GL_Account] = @Account, BranchCode = @BranchCode, Receipt = @Receipt,
       SubmitDate = @GetDate
   WHERE ID = @ID
END
在我的代码中,我在单击“finishBtn”时调用EmpSubmitTransactions查询

[HttpPost]
    public  ActionResult Index(List<CorpCardTransaction> list, string saveBtn, string finishBtn)
    {
        if (ModelState.IsValid)
        {
            if (saveBtn != null)
            {
                using (db)
                {
                    foreach (var i in list)
                    {
                        var t = db.CorpCardTransactions.Where(a => a.ID.Equals(i.ID)).FirstOrDefault();
                        if (t != null)
                        {
                            t.Description = i.Description;
                            t.GL_Account = i.GL_Account;
                            t.BranchCode = i.BranchCode;
                            t.Receipt = i.Receipt;
                        }
                    }
                    db.SaveChanges();
                    ViewBag.Message = "Successfully updated.";
                    return View(list);
                }
            }
            else 
            {
                using (db)
                {
                    foreach (var i in list)
                    {
                        db.sp_CorpCardExpense("EmpSubmitTransactions", i.ID, null, i.Description, i.GL_Account, i.BranchCode, i.Receipt, null, null, null, null);
                    }
                    return RedirectToAction("Index", "Statements");
                }
            }
        }
        else
        {
            ViewBag.Message = "Ooops, something is wrong with the Model State.  Try again.";
            return View(list);
        }
    }
}
[HttpPost]
公共操作结果索引(列表列表、字符串saveBtn、字符串finishBtn)
{
if(ModelState.IsValid)
{
如果(saveBtn!=null)
{
使用(db)
{
foreach(列表中的变量i)
{
var t=db.CorpCardTransactions.Where(a=>a.ID.Equals(i.ID)).FirstOrDefault();
如果(t!=null)
{
t、 描述=i.描述;
t、 总账账户=总账账户;
t、 BranchCode=i.BranchCode;
t、 收据=i.收据;
}
}
db.SaveChanges();
ViewBag.Message=“已成功更新。”;
返回视图(列表);
}
}
其他的
{
使用(db)
{
foreach(列表中的变量i)
{
db.sp_CorpCardExpense(“EmpSubmitTransactions”,i.ID,null,i.Description,i.GL_账户,i.BranchCode,i.Receipt,null,null,null);
}
返回重定向操作(“索引”、“语句”);
}
}
}
其他的
{
ViewBag.Message=“噢,模型状态有问题。请重试。”;
返回视图(列表);
}
}
}
当我单击finishBtn时,它确实到达了代码的正确部分,并尝试启动存储过程,但它给了我这个错误

数据读取器与指定的“CorpCardTransactionModel.sp_CorpCardExpense_Result”不兼容。“AccountID”类型的成员在数据读取器中没有同名的对应列


我没有试图返回所有字段,我只是试图将它们全部发送到存储过程,然后让存储过程执行一些其他操作,例如将字段标记为“完成”,然后再次将我重定向到语句列表。我只是更新表,不返回任何字段,并试图重定向,所以我想我不明白为什么它找不到“AccountID”。为什么它指的是数据读取器

我最终将所有查询分解成单独的存储过程。这样,当我选择从数据库更新时,我就可以将每个新的添加到我的模型中。它会自动为返回值的类型设置复杂类型,而不为没有数据返回的类型设置复杂类型(更新等)


工作得很好。谢谢你的建议

为什么不创建两个不同的存储过程,而不是一个过程根据字符串输入执行两个完全不同的操作?在我看来,这是一个可怕的设计。我们认为通过使用@action,我们可以将所有的查询放入每个项目的一个存储过程中。在使用datatables的WebForms中工作得很好,但我一辈子都不知道如何让它在EF中工作得很好。为每个查询创建新的存储过程是否更正确?对于这个特定的项目,我有8个不同的存储过程。这似乎效率不高。这就是答案吗?你们都同意应该为每个查询使用单独的存储过程吗?