2017-06-05 116 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)后,目前不支持。可悲的是。有没有更好的方法使用相关记录的更新和删除? –