如何在添加新标记之前检查数据库中是否存在标记?如果标签存在,我也不想复制它,只需将标签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);
}
如果可能,请告诉我以及如何做到这一点。
谢谢
答案 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();