Asp.Net Core EF Core many to many relation update command
我点击了此链接,在此处输入链接描述以创建多对多关系。但是,我不知道如何创建和更新Tag值到Post Object。
任何帮助将不胜感激。
更新,相关代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | class MyContext : DbContext { public DbSet<Post> Posts { get; set; } public DbSet<Tag> Tags { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<PostTag>() .HasKey(t => new { t.PostId, t.TagId }); modelBuilder.Entity<PostTag>() .HasOne(pt => pt.Post) .WithMany(p => p.PostTags) .HasForeignKey(pt => pt.PostId); modelBuilder.Entity<PostTag>() .HasOne(pt => pt.Tag) .WithMany(t => t.PostTags) .HasForeignKey(pt => pt.TagId); } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public List<PostTag> PostTags { get; set; } } public class Tag { public string TagId { get; set; } public List<PostTag> PostTags { get; set; } } public class PostTag { public int PostId { get; set; } public Post Post { get; set; } public string TagId { get; set; } public Tag Tag { get; set; } } |
Update2:更新记录的代码
使用以下代码,它将在两个表中创建记录。
1 2 3 4 5 | var p = new Post { Content ="C1" }; var t = new Tag { TagId ="T1" }; var pt = new PostTag { Post = p, Tag = t }; _context.PostTag.Add(pt); _context.SaveChanges(); |
但是,使用下面的代码,它将在中间表PostTag中插入新记录,而不是更新以前的记录。
1 2 3 4 5 6 7 8 9 10 | var t1 = new Tag { TagId ="T3" }; var t2 = new Tag { TagId ="T4" }; var p =_context.Posts.Find(1); p.PostTags = new List<PostTag>() { new PostTag{ Post=p, Tag=t1}, new PostTag{ Post=p, Tag=t2} }; _context.Posts.Update(p); _context.SaveChanges(); |
让我们创建一些示例数据
1 2 3 | var p = new Post { ... }; var t = new Tag { ... }; var pt = new PostTag { Post = p, Tag = t }; |
这仍然在内存中,因此我们必须将其添加到上下文中,从以下开始:
1 2 | db.Posts.Add(p); db.Tags.Add(t); |
请注意,在此阶段,
1)最简单的方法是添加
行
1 | db.PostTags.Add(pt); |
2)如果没有该额外的DbSet,您将需要确保从其他两个侧面进行链接。您还需要设置列表属性:
1 2 | p.PostTags = new List<PostTag> { pt }; t.PostTags = new List<PostTag> { pt }; |
EF现在将填写所有缺少的链接字段。