C# 在保存具有多对多关系的对象时,如何避免保存重复记录?
我正试着把我的想法用在这上面,但我真的需要一些指点 目前,我在两个实体之间有一个多对多关系,我的应用程序运行良好。但是,我想修改关于tags表的数据存储方式。我只希望在标签表中存储唯一的标签 Posts.cs:C# 在保存具有多对多关系的对象时,如何避免保存重复记录?,c#,entity-framework,asp.net-mvc-5,duplicates,many-to-many,C#,Entity Framework,Asp.net Mvc 5,Duplicates,Many To Many,我正试着把我的想法用在这上面,但我真的需要一些指点 目前,我在两个实体之间有一个多对多关系,我的应用程序运行良好。但是,我想修改关于tags表的数据存储方式。我只希望在标签表中存储唯一的标签 Posts.cs: public class Post : IEntity { [Key] public int Id { get; set; } public string Title { get; set; } public List<Tag> Tags {
public class Post : IEntity
{
[Key]
public int Id { get; set; }
public string Title { get; set; }
public List<Tag> Tags { get; set; } // many
}
公共类职位:IEntity
{
[关键]
公共int Id{get;set;}
公共字符串标题{get;set;}
公共列表标记{get;set;}//many
}
标签。cs:
public class Tag : IEntity
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public List<Post> Posts { get; set; } // many
}
公共类标记:IEntity
{
[关键]
公共int Id{get;set;}
公共字符串名称{get;set;}
公共列表发布{get;set;}//many
}
实体框架创建了3个表,每个类一个表,一个导航表,如下所示。如您所见,我目前正在存储相同标记名的副本
如何避免像这样保存重复记录?
我的直觉是从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");
}
[HttpPost]
公共操作结果创建([Bind(Include=“Title,URL,IntroText,Body,Created,Modified,Author,Tags”)]Post-Post)
{
if(ModelState.IsValid)
{
使用(UnitOfWork uwork=新UnitOfWork())
{
var newPost=新职位
{
Title=post.Title,
URL=post.URL,
IntroText=post.IntroText,
主体=更换,
作者,
//Tags=post.Tags
};
//检查重复条目
foreach(post.Tags中的var标记)
{
var tagCount=uwork.TagRepository.GetAll(),其中(s=>s.Name.Equals(tag.Name)).Count();
如果(标记计数<1){
//不确定我是否走对了路
}
}
uwork.PostRepository.Insert(newPost);
提交();
返回重定向操作(“索引”、“仪表板”);
}
}
返回重定向操作(“索引”、“仪表板”);
}
一旦我开始走这条路线,我就开始猜测这一点,因为我意识到如果我在这里有条件地省略重复的内容,帖子就会完全失去标签引用。如果有任何建议,我们将不胜感激。我想说,你的思路是正确的。如果标记名是唯一的,则无需“计数”。只要有第一个就行了。交换重复,不为Unique做任何事情
// 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);
}
}
因此,如果我从数据库中提取一个现有的标记记录,我只需扔掉传入的引用并将()标记添加到现有记录中?(现在就去试一下)我以为会很复杂,现在这很有意义。谢谢你的鞋子!这太棒了。