C# EF将新的多对多记录添加到表中
上下文类 这是我的上下文类。它的工作原理是在BlogsPostTags表中添加帖子ID和标签ID。。。但是,它添加了新的标记ID,而不是数据库中已存储的现有标记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
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));
}