Member 12988061 Ответов: 2

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);
        }

2 Ответов

Рейтинг:
0

Member 12988061

Мне очень жаль, что я включил закомментированный дубликат инструкции bind.


Karthik_Mahalingam

использовать Imporove вопрос чтобы отредактировать вопрос, не используйте виджет решения для публикации комментариев.

Рейтинг:
0

Member 12988061

Мое решение состояло в том, чтобы изменить хранимую процедуру так, чтобы у нее не было выходной переменной. Вместо этого теперь у него есть оператор select, чтобы передать мне данные. Затем я передаю данные в результаты.cshtml по страница. Я все еще открыт для изучения возможности передачи через выходной параметр, если есть какие-либо предложения.