如何在将新标签添加到数据库之前检查标签是否存在[ASP MVC]

时间:2016-02-18 15:08:22

标签: asp.net asp.net-mvc asp.net-mvc-4

如何在添加新标记之前检查数据库中是否存在标记?如果标签存在,我也不想复制它,只需将标签ID与图书ID相关联。

这是书类:

var cfn = angular.module('eventApp', ['ngRoute']);

cfn.config(function($routeProvider) {
  $routeProvider.when('/event/:language', {
    template: '<h1>{{title}}</h1>',
    controller: 'eventController'
  }).otherwise({redirectTo: '/event/en'});
});

cfn.controller('eventController', ['$scope', '$routeParams','$rootScope',
  function($scope, $routeParams, $rootScope) {
    $scope.title = $routeParams.language;
    $rootScope.language = $routeParams.language;
  }
]);

标记类:

 public partial class Book
{
    [Key]
    public int Book_id { get; set; }

    [Required]
    public string User_ID { get; set; }

    public string UrlSlug { get; set; }

    [Required]
    public string Book_name { get; set; }

    public int Edition { get; set; }

    public int Category_id { get; set; }

    public DateTime Publish_date { get; set; }

    public string Author_name { get; set; }

    public string Book_Image { get; set; }

    public string Download_Link { get; set; }

    public string pdf_file { get; set; }

    [AllowHtml]
    public string Book_Description { get; set; }

    public int View_Count { set; get; }

    public virtual string TagsListing { get; set; }

    public virtual ICollection<Tag> Tags { get; set; }

    public virtual Category Category { get; set; }
}

我的创建(新书控制器):

public class Tag
{
    public virtual int Id
    { get; set; }

    public virtual string Name
    { get; set; }

    public virtual string UrlSlug
    { get; set; }


    public virtual ICollection<Book> Books { get; set; }
}

我的创建视图:

[HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Create(Book model)
    {
        if (ModelState.IsValid)
        {

            if(model.TagsListing != null)
            {
                Collection<Tag> TagBooks = new Collection<Tag>();
                var s = model.TagsListing.ToString();
                string[] newTags = s.Split(',');

                foreach (var val in newTags)
                {

                    Tag iTag = new Tag
                    {
                        Name = val,
                        UrlSlug=val,

                    };
                    db.Tags.Add(iTag);
                    TagBooks.Add(iTag);
                }

                model.Tags = TagBooks;
            }



            db.Books.Add(model);
            await db.SaveChangesAsync();
            return RedirectToAction("Index");
        }




        return View(model);

    }

如果可能,请告诉我以及如何做到这一点。

谢谢

2 个答案:

答案 0 :(得分:2)

您需要根据发布的值查找数据库中的标记:

var tags = db.Tags.Where(m => newTags.Contains(m.Name)).ToList();

然后,您需要从已删除的集合中手动删除标记并添加已添加的标记:

// Remove deselected tags 
model.Tags.Where(t => !tags.Contains(t)).ToList()
    .ForEach(t => model.Tags.Remove(t));

// Add newly selected tags
tags.Where(t => !model.Tags.Contains(t)).ToList()
    .ForEach(t => model.Tags.Add(t));

修改

由于这是一个创建视图,因此该书还没有标签。我给了你修改现有书所需的代码,因为这是一个值得代码示例的更复杂的场景。对于一本全新的图书,您只需将标记直接设置为图书的属性,即model.Tags = tags

答案 1 :(得分:0)

编辑: 离开这个,因为它让提问者开始了,并且他们更容易阅读。但是,正如其他答案所示,有更有效的方法可以解决这个问题。

因为你正在进行字符串匹配所以要小心性能。我也假设你只想在名字上独一无二。如果没有,只需在FirstOrDefault语句中比较您想要的任何列。

所有标签:

foreach (var val in newTags)
{
    var iTag = db.Tags.FirstOrDefault(t => t.Name == val);
    if(iTag == null)
    {
      iTag = new Tag
      {
        Name = val,
        UrlSlug=val,
      };
      db.Tags.Add(iTag);
    }
    TagBooks.Add(iTag);
}
model.Tags = TagBooks;
db.Save();