2017-06-05 143 views
0

我跟着這個鏈接enter link description here來創建多對多的關係。但是,我不知道如何創建Tag值並將其更新爲Post對象。
任何幫助,將不勝感激。Asp.Net核心EF核心多對多關係更新命令

更新,相關的代碼

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

您的模型類的共享代碼 – Smit

+0

這是代碼從鏈接,我已更新我的帖子。 –

+0

代碼正常工作。你期待的結果是什麼?特別是可以詳細說明「而不是更新以前的記錄」。你在更新什麼以前的記錄? – Smit

回答

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你需要確保從其他兩面鏈接添加DbSet<PostTag>屬性,然後行

db.PostTags.Add(pt); 

2)。您還需要設置列表屬性:

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

EF現在填寫任何缺失的環節領域。

+0

謝謝,看來我需要手動操作中間表來插入Post和Tag之間的關係,對嗎?這種簡單的方法不適用於asp.net核心[使用DataAnnotation配置多對多關係](http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code -first.aspx)我只需要爲後期設置Tag屬性?更新Post的標籤似乎並不容易。 –

+0

我不確定EF Core是否會這樣做,但您必須先將兩個'列出 PostTags'屬性分別更改爲'列表'和'列表'。 –

+0

檢查[鏈接](https://github.com/aspnet/EntityFramework/issues/5965)後,目前不支持。可悲的是。有沒有更好的方法使用相關記錄的更新和刪除? –