Asp.Net核心EF核心多對多關係更新命令

asp.net-core entity-framework-core

我按照這個鏈接在這裡輸入鏈接描述來創建多對多的關係。但是,我不知道如何創建和更新Tag對象的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();

一般承認的答案

讓我們創建一些示例數據

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<PostTag>屬性,然後添加該行

db.PostTags.Add(pt);

2)如果沒有額外的DbSet,您需要確保從其他兩側進行鏈接。您還需要設置List屬性:

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

EF現在將填寫任何缺失的鏈接字段。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow