【问题标题】:How do I avoid saving duplicate records when saving objects with many to many relationships?保存具有多对多关系的对象时,如何避免保存重复记录?
【发布时间】:2015-08-02 12:55:45
【问题描述】:

我正在努力解决这个问题,但我真的可以使用一些指针。

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

Posts.cs:

public class Post : IEntity
{
    [Key]
    public int Id { get; set; }
    public string Title { get; set; }
    public List<Tag> Tags { 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    
}

Entity Framework 创建了 3 个表,每个类一个,一个导航表,看起来像这样。如您所见,我目前正在存储相同标签名称的重复副本。

如何避免这样保存重复记录?

我的直觉是从我通过 HttpPost 接收表单数据的 PostController 操作开始。

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

一旦我开始走这条路线,我就开始怀疑这一点,因为我意识到如果我有条件地省略这里的重复项,那么帖子将完全失去标签引用。任何指针将不胜感激。

【问题讨论】:

    标签: c# entity-framework asp.net-mvc-5 duplicates many-to-many


    【解决方案1】:

    我会说你在正确的轨道上。如果标签名称是唯一的,则无需“计数”。如果存在,只需获取第一个。换掉骗子,不为独特的人做任何事

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

    【讨论】:

    • 所以如果我从数据库中提取一个现有的标签记录,我只是简单地丢弃传入的引用并将标签添加()到现有记录? (现在要试试这个)
    • 我以为它会很复杂,现在这很有意义。谢谢鞋!这太棒了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2015-04-27
    相关资源
    最近更新 更多