C# 多对多实体框架核心如何插入

C# 多对多实体框架核心如何插入,c#,asp.net-core,entity-framework-core,many-to-many,C#,Asp.net Core,Entity Framework Core,Many To Many,根据MS的教程: 这就是我们定义Post和Tag的方式,它们彼此之间有许多关系: public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public ICollection<Tag> Tags { get; set; } } public class Tag {

根据MS的教程:

这就是我们定义Post和Tag的方式,它们彼此之间有许多关系:

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public ICollection<Tag> Tags { get; set; }
}

public class Tag
{
    public string TagId { get; set; }
    public ICollection<Post> Posts { get; set; }
}
现在,数据库在每个表中有2条记录。我的问题是我们如何添加一个包含tag1和tag2的新帖子?我下面的代码不起作用。有人能指出哪里出了问题吗?或者我需要用老方法添加第三个实体
PostTag

这是我的代码:

ICollection<Tag> tags = new List<Tag> {db.Tags.FirstOrDefault(i => i.TagId="Tag1"), db.Tags.FirstOrDefault(i => i.TagId="Tag2")};
db.Posts.Add(new Post { Title="Title3", Content="Content3", Tags=tags});

db.SaveChanges();

我还从代码中删除了PostId。

当您添加指定了
PostId
Post
时,将出现以下错误:

在以下情况下,无法在表“Posts”中插入标识列的显式值 标识\u插入被设置为关闭

只需删除
PostId
,代码即可正常工作:

ICollection<Tag> tags = new List<Tag> {
           db.Tags.FirstOrDefault(i => i.TagId="Tag1"), 
           db.Tags.FirstOrDefault(i => i.TagId="Tag2")};
db.Posts.Add(new Post { Title="Title3", Content="Content3", Tags=tags});

db.SaveChanges();
ICollection tags=新列表{
db.Tags.FirstOrDefault(i=>i.TagId=“Tag1”),
db.Tags.FirstOrDefault(i=>i.TagId=“Tag2”)};
添加(新帖子{Title=“Title3”,Content=“Content3”,Tags=Tags});
db.SaveChanges();

当您添加指定了
PostId的
Post
时,将出现以下错误:

在以下情况下,无法在表“Posts”中插入标识列的显式值 标识\u插入被设置为关闭

只需删除
PostId
,代码即可正常工作:

ICollection<Tag> tags = new List<Tag> {
           db.Tags.FirstOrDefault(i => i.TagId="Tag1"), 
           db.Tags.FirstOrDefault(i => i.TagId="Tag2")};
db.Posts.Add(new Post { Title="Title3", Content="Content3", Tags=tags});

db.SaveChanges();
ICollection tags=新列表{
db.Tags.FirstOrDefault(i=>i.TagId=“Tag1”),
db.Tags.FirstOrDefault(i=>i.TagId=“Tag2”)};
添加(新帖子{Title=“Title3”,Content=“Content3”,Tags=Tags});
db.SaveChanges();

正如@Rena已经提到的,您的代码无法工作,因为您在创建
Post
实体时设置了主键值(
PostId=3
)。我只想补充一个改进点

在下面的代码中,您要多次访问数据库,一次获取一个
标记-

ICollection<Tag> tags = new List<Tag> {db.Tags.FirstOrDefault(i => i.TagId="Tag1"), db.Tags.FirstOrDefault(i => i.TagId="Tag2")};
您的最终代码可能如下所示-

var tags = db.Tags.ToList();
var post = new Post
{
    Title = "Title3",
    Content = "Content3",
    Tags = tags.Where.(i => i.TagId == "Tag1" || i.TagId == "Tag2")).ToList()
}
db.Posts.Add(post);
db.SaveChanges()

正如@Rena已经提到的,您的代码无法工作,因为您在创建
Post
实体时设置了主键值(
PostId=3
)。我只想补充一个改进点

在下面的代码中,您要多次访问数据库,一次获取一个
标记-

ICollection<Tag> tags = new List<Tag> {db.Tags.FirstOrDefault(i => i.TagId="Tag1"), db.Tags.FirstOrDefault(i => i.TagId="Tag2")};
您的最终代码可能如下所示-

var tags = db.Tags.ToList();
var post = new Post
{
    Title = "Title3",
    Content = "Content3",
    Tags = tags.Where.(i => i.TagId == "Tag1" || i.TagId == "Tag2")).ToList()
}
db.Posts.Add(post);
db.SaveChanges()

您应该反复查看ICollection标记define/explain“不起作用”。因为如图所示的代码是正确的。您好@tala999,错误消息是什么?创建新帖子时无需指定PostId。另外,ef core的版本是什么?请勿在旁白中陈述错误消息。发布实际的错误消息。您应该遍历ICollection标记define/explain“不起作用”。因为如图所示的代码是正确的。您好@tala999,错误消息是什么?创建新帖子时无需指定PostId。另外,ef core的版本是什么?请勿在旁白中陈述错误消息。发布实际的错误消息。
var tags = db.Tags.ToList();
var post = new Post
{
    Title = "Title3",
    Content = "Content3",
    Tags = tags.Where.(i => i.TagId == "Tag1" || i.TagId == "Tag2")).ToList()
}
db.Posts.Add(post);
db.SaveChanges()