Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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
C# 在保存具有多对多关系的对象时,如何避免保存重复记录?_C#_Entity Framework_Asp.net Mvc 5_Duplicates_Many To Many - Fatal编程技术网

C# 在保存具有多对多关系的对象时,如何避免保存重复记录?

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 {

我正试着把我的想法用在这上面,但我真的需要一些指点

目前,我在两个实体之间有一个多对多关系,我的应用程序运行良好。但是,我想修改关于tags表的数据存储方式。我只希望在标签表中存储唯一的标签

Posts.cs:

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);
    }
}

因此,如果我从数据库中提取一个现有的标记记录,我只需扔掉传入的引用并将()标记添加到现有记录中?(现在就去试一下)我以为会很复杂,现在这很有意义。谢谢你的鞋子!这太棒了。