Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何在将新标记添加到数据库[ASP MVC]之前检查标记是否存在_Asp.net_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

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

Asp.net 如何在将新标记添加到数据库[ASP MVC]之前检查标记是否存在,asp.net,asp.net-mvc,asp.net-mvc-4,Asp.net,Asp.net Mvc,Asp.net Mvc 4,如何在添加新标签之前检查数据库中是否存在标签??此外,如果标签存在,我不想复制它,只需将标签id与图书id链接 这是图书课: public partial class Book { [Key] public int Book_id { get; set; } [Required] public string User_ID { get; set; } public string UrlSlug { get; set; } [Required

如何在添加新标签之前检查数据库中是否存在标签??此外,如果标签存在,我不想复制它,只需将标签id与图书id链接

这是图书课:

 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 int Book_id{get;set;}
[必需]
公共字符串用户_ID{get;set;}
公共字符串UrlSlug{get;set;}
[必需]
公共字符串Book_name{get;set;}
公共整数版{get;set;}
公共int类_id{get;set;}
公共日期时间发布\u日期{get;set;}
公共字符串作者名称{get;set;}
公共字符串Book_Image{get;set;}
公共字符串下载链接{get;set;}
公共字符串pdf_文件{get;set;}
[allowtml]
公共字符串Book_说明{get;set;}
public int View_Count{set;get;}
公共虚拟字符串标记列表{get;set;}
公共虚拟ICollection标记{get;set;}
公共虚拟类别{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; }
}
公共类标记
{
公共虚拟整数Id
{get;set;}
公共虚拟字符串名
{get;set;}
公共虚拟字符串UrlSlug
{get;set;}
公共虚拟ICollection图书{get;set;}
}
我的创建(新书控制器):

[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务创建(书本模型)
{
if(ModelState.IsValid)
{
如果(model.TagsListing!=null)
{
集合标记簿=新集合();
var s=model.TagsListing.ToString();
字符串[]newTags=s.Split(',');
foreach(新标签中的var val)
{
标签iTag=新标签
{
Name=val,
UrlSlug=val,
};
db.Tags.Add(iTag);
TagBooks.Add(iTag);
}
model.Tags=TagBooks;
}
db.Books.Add(模型);
等待db.saveChangesSync();
返回操作(“索引”);
}
返回视图(模型);
}
我的创建视图:

<div class="form-group">
                    <h4>@Html.LabelFor(model => model.TagsListing, htmlAttributes: new { @class = "control-label col-md-3"})</h4>
                    <div class="col-md-6">
                        @Html.EditorFor(model => model.TagsListing, new { htmlAttributes = new { @class = "alert-info form-control",@id= "tags"} })
                        @Html.ValidationMessageFor(model => model.TagsListing, "", new { @class = "text-danger" })
                    </div>
                </div>

@LabelFor(model=>model.TagsListing,htmlAttributes:new{@class=“controllabel col-md-3”})
@EditorFor(model=>model.TagsListing,new{htmlAttributes=new{@class=“alert info form control”,@id=“tags”})
@Html.ValidationMessageFor(model=>model.TagsListing,“,new{@class=“text danger”})
如果可能的话,请让我知道以及如何做到这一点


谢谢

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

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

编辑: 留下这个,因为它让提问者开始提问,并且让他们更容易阅读。然而,正如其他答案所显示的那样,有更有效的方法来实现这一点

由于您正在进行字符串匹配,请注意性能。我还假设你只是想在名字上与众不同。如果不是,只需比较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();

你能不能把这个代码添加到我的控制器代码中,并给我一个完整的答案,因为当我尝试你的答案时,得到了一个空的异常,我可以添加这个错误或者遗漏了什么。因为实际上我在使用你的答案时得到了一个空的异常,但是我真的很喜欢你在这里发布的代码方式,所以,如果你能告诉我你的代码是如何与我的控制器一起工作的,我会把它也标记为答案。。非常感谢,是的,实际上我正在查找所有标记,如果来自视图的标记名已经存在,我想:1-不要添加新标记。2-将标签id与书籍id链接。您的答案是正确的,但仍然需要创建一个链接,顺便说一句,标记存在,书籍已更改以反映您的需要。谢谢,我尝试了它,但出现了以下错误:对象引用未设置为对象的实例。
第156行:model.Tags.Add(iTag);这是可行的,但效率非常低。您正在发出N个查询,其中N是标记数。您应该首先从数据库中选择所有相关标记,而不是一次选择一个。NoSQL不比SQL好也不比SQL差。它只是有不同的用例。在有意义的时候使用它,而不仅仅是因为你认为它“更快”。在某些情况下会是这样,而在另一些情况下,传统的SQL会把它打败。
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();