我应该使用try catch还是if else来检查外键?

时间:2015-12-09 23:03:38

标签: c# sql-server asp.net-mvc

我有两个表,一个用于帖子,第二个用于评论。 comments表包含用于将表与posts表链接的列PostId。我编写以下代码来插入新评论:

[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值无效(posts表中没有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");
    }
}

2 个答案:

答案 0 :(得分:3)

让它失败。当方法无法实现其目的时,应抛出异常。如果方法的目的是为给定帖子插入注释,则如果帖子不存在则不能这样做。抛出异常。

让告诉请求创建注释的方法决定如何处理方法无法按要求执行的情况。

您可能希望控制抛出的权限,但前提是您认为可以提供更好/更多信息。

答案 1 :(得分:-1)

两者都没有 - 让数据库引擎将插入请求加入外表;插入生成的 relvar ;并返回插入记录的数量。如果返回的计数小于传输的计数,则在代码中将错误处理为错误。

此机制将确保在尝试插入时正确存在 ,而不是在您碰巧检查其存在时的某个先前时间。

它还可以最大限度地减少客户端和服务器之间的握手次数,这样可以更容易扩展,并且可以在等待数据库来回等待时消除对外部表的锁定的诱惑。 / p>