gpt4 book ai didi

asp.net-mvc - 将存储过程与具有附加参数的 Linq To Sql 一起使用

转载 作者:行者123 更新时间:2023-12-02 00:44:06 27 4
gpt4 key购买 nike

我有一个非常大的问题,似乎无法在互联网上找到任何其他人遇到我的问题。我当然希望 StackOverflow 可以帮助我...

我正在编写一个 ASP.NET MVC 应用程序,我正在使用带有 Linq To Sql 的存储库概念作为我的数据存储。关于从 View 中选择行,一切都很好。并捕获非常基本的业务规则约束。但是,我在删除、插入和更新的存储过程映射中遇到了问题。让我解释一下:

我们的 DBA 已投入大量工作将业务逻辑放入我们所有的存储过程中,这样我就不必担心这一点。当然,我进行基本验证,但他管理数据完整性和日期约束冲突等......我面临的问题是所有存储过程(我的意思是所有)都有 5 个附加参数(6 个用于插入) 向我提供信息。这个想法是,当出现问题时,我可以用我们数据库中的适当信息提示用户。

例如:

sp_AddCategory(
@userID INT,
@categoryName NVARCHAR(100),
@isActive BIT,
@errNumber INT OUTPUT,
@errMessage NVARCHAR(1000) OUTPUT,
@errDetailLogID INT OUTPUT,
@sqlErrNumber INT OUTPUT,
@sqlErrMessage NVARCHAR(1000) OUTPUT,
@newRowID INT OUTPUT)

从上面的存储过程中,前 3 个参数是唯一用于“创建”类别记录的参数。剩下的参数只是用来告诉我方法内部发生了什么。如果存储过程中的业务规则被破坏,当业务规则被破坏时,他不会使用 SQL 'RAISEERROR' 关键字。相反,他使用 OUTPUT 参数向我提供有关错误的信息。他对我们数据库中的每个存储过程都这样做,甚至是更新和删除。所有“获取”调用都是使用自定义 View 完成的。它们都经过了测试,目的是让我的工作更轻松,因为我不必添加业务逻辑来捕获所有各种场景以确保数据质量。

正如我所说,我正在使用 Linq To Sql,但我现在遇到了一个问题。问题是我的“Category”模型对象只有 4 个属性:CategoryID、CategoryName、UserId 和 IsActive。当我打开设计器开始为插入映射我的属性时,我意识到我真的没有(简单的)方法来考虑额外的参数,除非我将它们添加到我的模型对象中。

理论上我想做的是:

// note: Repository Methods
public void AddCategory(Category category)
{
_dbContext.Categories.InsertOnSubmit(category);
}

public void Save()
{
_dbContext.SubmitChanges();
}

然后在我的 CategoryController 类中,我只需执行以下操作:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection collection)
{
var category = new Category();
try
{
UpdateModel(category); // simple validation here...

_repository.AddCategory(category);
_repository.Save(); // should get error here!!

return RedirectToAction("Index");
}
catch
{
// manage friendly messages here somehow... (??)
// ...

return View(category);
}
}

使用 Linq to Sql 管理此问题的最佳方法是什么?我(个人)认为将所有这些附加属性添加到每个模型对象是没有意义的......例如,'Get' 应该永远不会有错误并且我不希望我的存储库方法返回一个Get 调用的对象类型,但 CUD 调用接受另一种对象类型。

更新:我的解决方案! (2009 年 12 月 1 日)

这是我为解决问题所做的工作。我摆脱了我所有存储库上的“Save()”方法。相反,我向每个存储库添加了一个“Update()”方法,并在每次 CUD(即创建/更新/删除)调用时实际将数据提交到数据库。

我知道每个存储过程都有相同的参数,所以我创建了一个类来保存它们:

public class MySprocArgs 
{
private readonly string _methodName;
public int? Number;
public string Message;
public int? ErrorLogId;
public int? SqlErrorNumber;
public string SqlErrorMessage;
public int? NewRowId;

public MySprocArgs(string methodName)
{
if (string.IsNullOrEmpty(methodName))
throw new ArgumentNullException("methodName");

_methodName = methodName;
}

public string MethodName
{
get { return _methodName; }
}

}

我还创建了一个 MySprocException,它在其构造函数中接受 MySprocArgs:

public class MySprocException : ApplicationException
{

private readonly MySprocArgs _args;
public MySprocException(MySprocArgs args) : base(args.Message)
{
_args = args;
}

public int? ErrorNumber
{
get { return _args.Number; }
}

public string ErrorMessage
{
get { return _args.Message; }
}

public int? ErrorLogId
{
get { return _args.ErrorLogId; }
}

public int? SqlErrorNumber
{
get { return _args.SqlErrorNumber; }
}

public string SqlErrorMessage
{
get { return _args.SqlErrorMessage; }
}
}

现在这就是一切汇集的地方......使用我在最初查询中开始的示例,“AddCategory()”方法可能如下所示:

public void AddCategory(Category category)
{
var args = new MySprocArgs("AddCategory");
var result = _dbContext.AddWidgetSproc(
category.CreatedByUserId,
category.Name,
category.IsActive,
ref args.Number, // <-- Notice use of 'args'
ref args.Message,
ref args.ErrorLogId,
ref args.SqlErrorNumber,
ref args.SqlErrorMessage,
ref args.NewRowId);

if (result == -1)
throw new MySprocException(args);
}

现在在我的 Controller 中,我只需执行以下操作:

[HandleError(ExceptionType = typeof(MySprocException), View = "SprocError")]
public class MyController : Controller
{
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Category category)
{
if (!ModelState.IsValid)
{
// manage friendly messages
return View(category);
}

_repository.AddCategory(category);
return RedirectToAction("Index");

}
}

管理新的 MySprocException 的诀窍是简单地使用 HandleError 属性捕获它,并将用户重定向到理解 MySprocException 的页面。

希望对大家有所帮助。 :)

最佳答案

我认为您不能将输出参数添加到任何 LINQ 类,因为这些参数不会保留在数据库的任何表中。

但是您可以通过以下方式在 LINQ 中处理输出参数。

使用设计器将您希望调用的存储过程添加到您的 .dbml。

在你的代码中调用你的存储过程

 using (YourDataContext context = new YourDataContext())
{
Nullable<int> errNumber = null;
String errMessage = null;
Nullable<int> errDetailLogID = null;
Nullable<int> sqlErrNumber = null;
String sqlErrMessage = null;
Nullable<int> newRowID = null;
Nullable<int> userID = 23;
Nullable<bool> isActive=true;

context.YourAddStoredProcedure(userID, "New Category", isActive, ref errNumber, ref errMessage, ref errDetailLogID, ref sqlErrNumber, ref sqlErrMessage, ref newRowID);
}

关于asp.net-mvc - 将存储过程与具有附加参数的 Linq To Sql 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1423179/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com