【问题标题】:Asp.Net Core EF Core many to many relation update commandAsp.Net Core EF Core 多对多关系更新命令
【发布时间】:2017-06-06 13:22:55
【问题描述】:

我点击此链接enter link description here 创建多对多关系。但是,我不知道如何创建标签值并将其更新为 Post 对象。
任何帮助将不胜感激。

更新,相关代码

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

【问题讨论】:

  • 共享模型类的代码
  • 这是链接中的代码,我已经更新了我的帖子。
  • 代码运行良好。你期待的结果是什么?特别是您能否详细说明“而不是更新以前的记录”。您更新了哪些以前的记录?

标签: asp.net-core entity-framework-core


【解决方案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);

请注意,在这个阶段,pt 都不知道 pt。有两种方法可以将第三个实体插入到数据库中。

1) 最简单的方法是添加DbSet&lt;PostTag&gt; 属性,然后添加行

db.PostTags.Add(pt);

2) 如果没有额外的 DbSet,您将需要确保来自其他 2 侧的链接。您还需要设置列表属性:

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

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

【讨论】:

  • 谢谢,看来我需要手动操作中间表来插入Post和Tag的关系,对吗?这种简单的方法是否不适用于 asp.net core Configure Many-to-Many relationship using DataAnnotation 我只需要为 post 设置 Tag 属性?更新帖子的标签似乎并不容易。
  • 我不确定 EF Core 是否会这样做,但您必须首先将两个 List&lt;PostTag&gt; PostTags 属性分别更改为 List&lt;Post&gt;List&lt;Tag&gt;
  • 查看link,目前不支持。可悲的是。有没有更好的方法对相关记录使用更新和删除?
猜你喜欢
  • 2021-10-11
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 2022-01-14
  • 2021-10-26
  • 2019-01-19
  • 1970-01-01
  • 2021-05-02
相关资源
最近更新 更多