Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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# EF将新的多对多记录添加到表中_C#_Asp.net Mvc_Entity Framework_Relational Database - Fatal编程技术网

C# EF将新的多对多记录添加到表中

C# EF将新的多对多记录添加到表中,c#,asp.net-mvc,entity-framework,relational-database,C#,Asp.net Mvc,Entity Framework,Relational Database,上下文类 这是我的上下文类。它的工作原理是在BlogsPostTags表中添加帖子ID和标签ID。。。但是,它添加了新的标记ID,而不是数据库中已存储的现有标记 public class WebsiteDBContext : DbContext { public DbSet<BlogPost> BlogPosts { get; set; } public DbSet<Tag> Tags { get; set; } public DbSet<A

上下文类 这是我的上下文类。它的工作原理是在BlogsPostTags表中添加帖子ID和标签ID。。。但是,它添加了新的标记ID,而不是数据库中已存储的现有标记

public class WebsiteDBContext : DbContext
{
    public DbSet<BlogPost> BlogPosts { get; set; }
    public DbSet<Tag> Tags { get; set; }
    public DbSet<Author> Authors { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<BlogPost>().HasRequired(bp => bp.Author).WithMany(a => a.BlogPosts);
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<BlogPost>().HasMany(bp => bp.Tags).WithMany(t => t.Posts).Map(m =>
        {
            m.MapLeftKey("BlogPostID");
            m.MapRightKey("TagID");
            m.ToTable("BlogPostTags");
        });
    }
}
但真正发生的是,它在tags表中创建了带有id的新标记。像这样

Tag Table                         BlogPostTags Table

ID  Name                          BlogID    TagID
----------------                  ----------------
1   Dogs                            1         13
2   Cats                            1         14
3   Birds                           1         15
4   Horses
5   Rabbits
6   Reptiles
7   Insects
8   Nature
9   Puppies
10  Kittens
11  Cute
12  Products
13  Dogs
14  Puppies
15  Cute
重复的名字是不好的!如何修复此问题以获得预期结果?这是我的ActionResult方法

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Title,PublishDate,PublishTime,Body,AuthorID,Tags")] CreateBlogPostVM blogpost)
{
    List<Tag> tags = new List<Tag>();
    foreach (var tag in blogpost.Tags.Where(t => t.IsChecked == true))
    {
        tags.Add(new Tag { TagID = tag.TagID, Name = tag.Name });
    }
    if (ModelState.IsValid)
    {
        BlogPost newPost = new BlogPost
        {
            Title = blogpost.Title,
            PublishDate = blogpost.PublishDate,
            PublishTime = blogpost.PublishTime,
            Body = blogpost.Body,
            Author = db.Authors.Where(bp => bp.AuthorID == blogpost.AuthorID).Single(),
            Tags = tags //Add list of tags 
        };
        db.BlogPosts.Add(newPost);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(blogpost);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include=“Title,PublishDate,PublishTime,Body,AuthorID,Tags”)]CreateBlogPostVM blogpost)
{
列表标签=新列表();
foreach(blogpost.Tags.Where(t=>t.IsChecked==true)中的var标记)
{
添加(新标签{TagID=Tag.TagID,Name=Tag.Name});
}
if(ModelState.IsValid)
{
BlogPost newPost=新BlogPost
{
Title=blogpost.Title,
PublishDate=blogpost.PublishDate,
PublishTime=blogpost.PublishTime,
Body=blogpost.Body,
Author=db.Authors.Where(bp=>bp.AuthorID==blogpost.AuthorID).Single(),
标记=标记//添加标记列表
};
db.BlogPosts.Add(newPost);
db.SaveChanges();
返回操作(“索引”);
}
返回视图(blogpost);
}

您需要查找数据库中已经存在的现有标记,而不是添加新标记。替换此项:

        foreach (var tag in blogpost.Tags.Where(t => t.IsChecked == true))
        {
            tags.Add(new Tag { TagID = tag.TagID, Name = tag.Name });
        }
与:


(这假设TagID是标记表的主键,如果不是,您可以执行类似于
tags.Add(db.tags.Where(t=>t.TagID==tag.TagID).First())

的操作,我不太确定正确的方法。谢谢
        foreach (var tag in blogpost.Tags.Where(t => t.IsChecked == true))
        {
            tags.Add(new Tag { TagID = tag.TagID, Name = tag.Name });
        }
        foreach (var tag in blogpost.Tags.Where(t => t.IsChecked == true))
        {
            tags.Add(db.Tags.Find(tag.TagID));
        }