保存具有多对多关系的对象时,如何避免保存重复记录?
How do I avoid saving duplicate records when saving objects with many to many relationships?
我正在努力解决这个问题,但我真的可以使用一些指导。
目前,我在两个实体之间建立了多对多关系,并且我的应用程序运行良好。但是,我想修改有关标签 table 的数据存储方式。我只想将唯一标签存储在标签 table.
中
Posts.cs:
public class Post : IEntity
{
[Key]
public int Id { get; set; }
public string Title { get; set; }
public List<Tag> Tags { get; set; } // many
}
Tags.cs:
public class Tag : IEntity
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public List<Post> Posts { get; set; } // many
}
Entity Framework 已经创建了 3 个 table,每个 class 一个,一个导航 table 看起来像这样。如您所见,我目前正在存储相同标签名称的重复副本。
如何避免像这样保存重复的记录?
我的直觉是从我的 PostController 操作开始,在该操作中我通过 HttpPost 接收表单数据。
PostController.cs
[HttpPost]
public ActionResult Create([Bind(Include = "Title,URL,IntroText,Body,Created,Modified,Author,Tags")] Post post)
{
if (ModelState.IsValid)
{
using (UnitOfWork uwork = new UnitOfWork())
{
var newPost = new Post
{
Title = post.Title,
URL = post.URL,
IntroText = post.IntroText,
Body = replace,
Author = post.Author,
//Tags = post.Tags
};
// check for duplicate entries
foreach (var tag in post.Tags)
{
var tagCount = uwork.TagRepository.GetAll().Where(s => s.Name.Equals(tag.Name)).Count();
if (tagCount < 1) {
// not sure if I'm on the right track
}
}
uwork.PostRepository.Insert(newPost);
uwork.Commit();
return RedirectToAction("Index", "Dashboard");
}
}
return RedirectToAction("Index", "Dashboard");
}
一旦我开始走这条路线,我就开始重新猜测,因为我意识到如果我有条件地在这里省略重复项,post 将完全丢失标签引用。任何指针将不胜感激。
我会说你走在正确的轨道上。如果标签名称是唯一的,则无需 "Count"。如果存在,就获取第一个。换掉骗子,不为唯一性做任何事情
// check for duplicate entries
foreach (var tag in post.Tags.ToList())
{
var dupeTag = uwork.TagRepository.GetAll().FirstOrDefault(t => t.Name == tag.Name);
//Replace tag with the dupe if found
if(dupeTag != null)
{
post.Tags.Remove(tag);
post.Tags.Add(dupeTag);
}
}
我正在努力解决这个问题,但我真的可以使用一些指导。
目前,我在两个实体之间建立了多对多关系,并且我的应用程序运行良好。但是,我想修改有关标签 table 的数据存储方式。我只想将唯一标签存储在标签 table.
中Posts.cs:
public class Post : IEntity
{
[Key]
public int Id { get; set; }
public string Title { get; set; }
public List<Tag> Tags { get; set; } // many
}
Tags.cs:
public class Tag : IEntity
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public List<Post> Posts { get; set; } // many
}
Entity Framework 已经创建了 3 个 table,每个 class 一个,一个导航 table 看起来像这样。如您所见,我目前正在存储相同标签名称的重复副本。
如何避免像这样保存重复的记录?
我的直觉是从我的 PostController 操作开始,在该操作中我通过 HttpPost 接收表单数据。
PostController.cs
[HttpPost]
public ActionResult Create([Bind(Include = "Title,URL,IntroText,Body,Created,Modified,Author,Tags")] Post post)
{
if (ModelState.IsValid)
{
using (UnitOfWork uwork = new UnitOfWork())
{
var newPost = new Post
{
Title = post.Title,
URL = post.URL,
IntroText = post.IntroText,
Body = replace,
Author = post.Author,
//Tags = post.Tags
};
// check for duplicate entries
foreach (var tag in post.Tags)
{
var tagCount = uwork.TagRepository.GetAll().Where(s => s.Name.Equals(tag.Name)).Count();
if (tagCount < 1) {
// not sure if I'm on the right track
}
}
uwork.PostRepository.Insert(newPost);
uwork.Commit();
return RedirectToAction("Index", "Dashboard");
}
}
return RedirectToAction("Index", "Dashboard");
}
一旦我开始走这条路线,我就开始重新猜测,因为我意识到如果我有条件地在这里省略重复项,post 将完全丢失标签引用。任何指针将不胜感激。
我会说你走在正确的轨道上。如果标签名称是唯一的,则无需 "Count"。如果存在,就获取第一个。换掉骗子,不为唯一性做任何事情
// check for duplicate entries
foreach (var tag in post.Tags.ToList())
{
var dupeTag = uwork.TagRepository.GetAll().FirstOrDefault(t => t.Name == tag.Name);
//Replace tag with the dupe if found
if(dupeTag != null)
{
post.Tags.Remove(tag);
post.Tags.Add(dupeTag);
}
}