我按照此链接enter link description here创建了多对多的关系。但是,我不知道如何为Post对象创建和更新Tag值 任何帮助将不胜感激。
更新,相关代码
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:更新记录代码 使用以下代码,它将在两个表中创建记录。
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中插入新记录,而不是更新以前的记录。
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();
答案 0 :(得分:1)
让我们创建一些示例数据
var p = new Post { ... };
var t = new Tag { ... };
var pt = new PostTag { Post = p, Tag = t };
这仍然在内存中,因此我们必须将其添加到上下文中,从:
开始db.Posts.Add(p);
db.Tags.Add(t);
请注意,在此阶段,p
和t
都不知道pt
。有两种方法可以将第三个实体插入数据库。
1)最简单的方法是添加DbSet<PostTag>
属性,然后添加
db.PostTags.Add(pt);
2)如果没有额外的DbSet,您需要确保从其他两侧进行链接。您还需要设置列表属性:
p.PostTags = new List<PostTag> { pt };
t.PostTags = new List<PostTag> { pt };
EF现在将填写任何缺失的链接字段。