WebApi - 删除事件之前的参照完整性检查

时间:2014-01-11 02:44:44

标签: c# asp.net-mvc entity-framework asp.net-web-api

我正在尝试从数据库中删除标签。还有另一个名为Pages的项目集合。每个页面都有多个标签。在删除之前,如何确保标签不属于任何页面?有什么建议吗?

到目前为止,这是我的进展。这是默认的删除操作,增加了两个变量:

    // DELETE api/Tag/5
    public HttpResponseMessage DeleteTag(int id)
    {
        // Added variables
        var nullTags = db.Tags.Where(c => c.Pages.Count == 0);
        var matched = db.Tags.Where(c => c.TagId == id);

        Tag tag = db.Tags.Find(id);
        if (tag == null)
        {
            return Request.CreateResponse(HttpStatusCode.NotFound);
        }

        db.Tags.Remove(tag);

        try
        {
            db.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {
            return Request.CreateResponse(HttpStatusCode.NotFound);
        }

        return Request.CreateResponse(HttpStatusCode.OK, tag);
    }

3 个答案:

答案 0 :(得分:1)

将第一行更改为:

Tag tag = db.Tags.Where(c => (c.id == id) && (c.Pages.Count == 0)).FirstOrDefault();

if (tag != null) {
    //It does not have pages, so you can delete it...
}

答案 1 :(得分:1)

您可以确保标签没有任何页面。

var tag = db.Tags.SingleOrDefault(t => t.id == id);

if (tag == null) 
{
    return Request.CreateResponse(HttpStatusCode.NotFound);
}

if (tag.Pages.Any()) 
{
    return Request.CreateResponse(
        HttpStatusCode.BadRequest, 
        "A tag must not be assigned to any page before you delete it"
    );
}

db.Tags.Remove(tag);
db.SaveChanges();

return Request.CreateResponse(HttpStatusCode.OK, tag);

答案 2 :(得分:0)

为什么不在数据库级别启用参照完整性?如果您使用的是MSSQL,这很容易。我想知道是否有一个特定的原因可以在应用程序级别处理它,因为它可以很容易地在数据库级别处理?