Asp.Net Core EF Core多对多关系更新命令

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

请注意,在此阶段,pt都不了解pt。有两种方法可以将第三个实体插入数据库。

1)最简单的方法是添加DbSet<PostTag>属性,然后添加

1
db.PostTags.Add(pt);

2)如果没有该额外的DbSet,您将需要确保从其他两个侧面进行链接。您还需要设置列表属性:

1
2
p.PostTags = new List<PostTag> { pt };
t.PostTags = new List<PostTag> { pt };

EF现在将填写所有缺少的链接字段。