我应该使用try-catch还是if else来检查外键
本文关键字:检查 else if try-catch 还是 我应该 | 更新日期: 2023-09-27 18:26:15
我有两个表,一个用于发布,另一个用于评论。comments表包含列PostId
,用于将该表与posts表链接起来。我写了以下代码来插入新的注释:
[HttpPost]
public JsonResult NewComment(int PostId,string Text)
{
Comment comment = new Comments();
comment.PostId = PostId;
comment.Text = Text;
comment.Date = DateTime.Now;
using (var db = new DatabaseContext())
{
db.Comments.Add(comment);
db.SaveChanges();
}
return Json("Valid Comment");
}
唯一可能发生的错误是PostId
值无效(post-in-posts表中没有与客户端提供的PostId相同的PostId)。我的问题是如何最好地处理这个错误。我应该使用这样的try-catch吗:
using (var db = new DatabaseContext())
{
db.Comments.Add(comment);
try
{
db.SaveChanges();
return Json("Valid Comment");
}
catch
{
return Json("Invalid Comment");
}
}
或者我应该通过以下操作首先检查PostId值是否有效:
using (var db = new DatabaseContext())
{
var y = db.Posts.Where(x => x.PostId == PostId).SingleOrDefault();
if (y != null)
{
db.Comments.Add(comment);
db.SaveChanges();
return Json("Valid Comment");
}
else
{
return Json("Invalid Comment");
}
}
让它失败。当一个方法不能实现其目的时,应该抛出异常。如果一个方法的目的是为给定的帖子插入评论,那么如果帖子不存在,它就不能这样做。引发异常。
让告诉请求创建注释的方法决定如何处理方法无法按请求执行的情况。
你可能想控制抛出的exception,但前提是你觉得自己可以提供更好/更多的信息。
两者都没有-让DB引擎将插入请求加入到外部表;插入结果relvar;并返回插入的记录数。如果返回的计数小于传输的计数,则将代码中的错误视为故障进行适当处理。
此机制将确保外来引用在尝试插入时精确存在,而不是在您碰巧检查其存在的某个时间。
它还最大限度地减少了客户端和服务器之间的握手次数,这将更容易扩展,并消除了在等待数据库来回时锁定外部表的任何诱惑。