Entity framework MVC 5 и хранимые процедуры без возвращаемых данных
Я новичок в MVC и Entity Framework. У меня есть следующая хранимая процедура в SQL Server 2012:
-------------------------------------------------------------------------------
ALTER PROCEDURE [Elite].[AppInsertMrwdUpgrade] ( @UpgradeGrpID INT ,@MrwdID VARCHAR(9) ,@EID VARCHAR(10) ,@ResultMsg VARCHAR(255) = NULL OUTPUT ) AS SET NOCOUNT ON; SELECT DISTINCT TOP 1 @ResultMsg = CONCAT('Marriott Rewards Number : ' ,@MrwdID, ' has already been succesfully upgraded to ', IIF(A.UpgradeLvlCd = 'P', 'Platinum' , 'Gold') , '.') FROM Elite.MrwdUpgradeTranHist AS A JOIN Elite.UpgradeGrpRef AS B ON A.UpgradeGrpID = B.UpgradeGrpID WHERE A.MrwdID = @MrwdID AND A.ResponseDt IS NOT NULL AND A.ResponseCd IN ('NO UPDATE LEVEL - LEV, LEV TYP & DT SAME','UPGRADE LEVEL LOWER THAN CURRENT LEVEL','NNIGN') AND A.UpgradeLvlCd >= B.MaxLvl ORDER BY 1 DESC ; IF @ResultMsg IS NOT NULL BEGIN RETURN END ; DECLARE @Lvl CHAR(1) SELECT @Lvl = R.MaxLvl FROM Elite.UpgradeGrpRef AS R WHERE R.UpgradeGrpID = @UpgradeGrpID ; INSERT INTO Elite.MrwdUpgradeTranHist ( UpgradeGrpID , MrwdID , UpgradeLvlCd , InputDt , InputSource , UserID ) VALUES ( @UpgradeGrpID ,@MrwdID ,@Lvl ,GETDATE() ,'Manual_Assoc' ,@EID ) ; SET @ResultMsg = CONCAT('Success! Marriott Rewards Number : ' ,@MrwdID, ' has been submitted for upgrade to ', IIF(@Lvl = 'P', 'Platinum' , 'Gold') , '.') ; RETURN
-------------------------------------------------------------------------------
Я хочу иметь возможность использовать MVC 5 и Entity Framework для вызова этой хранимой процедуры для вставки записи, если она не является дубликатом. Я буду использовать GroupID, MrwdID и EID для ввода текстового поля с кнопкой submit для активации вызова хранимой процедуры. Я ожидал бы получить обратно @ResultMsg и иметь возможность либо очистить форму при успешном выполнении, либо сохранить информацию в текстовых полях для редактирования с всплывающим сообщением пользователю. (Я понимаю, что некоторые из них могут быть плохими практиками. Мы используем это в нашей интрасети только с помощью IIS). Я надеюсь, что с тем, что я предоставил, решение может быть найдено.
Что я уже пробовал:
Мне удалось сначала создать в качестве базы данных модель сущности данных, которая идентифицировала как хранимую процедуру, так и функцию, идентифицированную без возвращаемой коллекции. Оттуда, когда я пытаюсь создать контроллер с видом, он ошибается, говоря, что объекта нет.
Я попробовал использовать связанную таблицу, и она действительно создавала представления. Я использовал представление Create и изменил его следующим образом:
-------------------------------------------------------------------------------
@model EliteMrwd.Models.MrwdUpgradeTranHist @{ ViewBag.Title = "Create"; } <h2>Submit Upgrade</h2> @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div class="form-horizontal"> <hr> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.Label("Group ID: ", htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> <input type="text" id="UpgradeGrpID" name="UpgradeGrpID" value= @ViewBag.idName /> @Html.ValidationMessageFor(model => model.UpgradeGrpID, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.Label("Marriott Rewards #: ", htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.MrwdID, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.MrwdID, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.Label("Submitting Person: ", htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => @User.Identity.Name.Split('\\')[1], new { htmlAttributes = new {@class = "form-control", @disabled="true" } }) @Html.ValidationMessageFor(model => model.UserID, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> </div> </div> </div> } @*<div> @Html.ActionLink("Back to List", "Index") </div>*@ @section Scripts { @Scripts.Render("~/bundles/jqueryval") }
------------------------------------------------------------------------------
Мой контроллер имеет следующие разделы кода:
------------------------------------------------------------------------------
public ActionResult Create(string id) { if (id == null) { ViewBag.idName = ""; } else { ViewBag.idName = id; } return View(); } and [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include = "TranID,UpgradeGrpID,MrwdID,UpgradeLvlCd,InputDt,InputSource,UserID,ExportDt,ExportCd,ResponseDt,ResponseCd")] MrwdUpgradeTranHist mrwdUpgradeTranHist) { //[Bind(Include = "TranID,UpgradeGrpID,MrwdID,UpgradeLvlCd,InputDt,InputSource,UserID,ExportDt,ExportCd,ResponseDt,ResponseCd" if (ModelState.IsValid) { db.MrwdUpgradeTranHists.Add(mrwdUpgradeTranHist); db.SaveChanges(); return RedirectToAction("Index"); } return View(mrwdUpgradeTranHist); }