尝试在引用表中插入多行,出现错误 IDENTITY_INSERT

问题描述 投票:0回答:4

所以我想做的是获取一个带有 id 的帖子列表,然后循环它并使用 Linq EFcore 将其添加到数据库中,但是当帖子中有多个 id(如果只有一个有效)时,我会收到错误很好。

public async Task<IActionResult> Create([Bind("Name,IsPublished,CretedDate,ModifiyDate,posts")] Tag tag,List<int> posts)
{
    if (ModelState.IsValid)
    {
        foreach (var item in posts)
        {
            var _post = _contextPosts.dbcontext.Post.Find(item); // fetch one record from posts 
            tag.PostTag = new List<PostTag> //Tag
            {
                 new PostTag 
                 {
                      Post = _post,
                      Tag = tag
                      }
            };
            
            _contextTags.dbcontext.Add(tag);

            await _contextTags.dbcontext.SaveChangesAsync();
        }
    }
}

表格

public class Post
{
    [Key]
    public int Id { get; set; }
    [Display(Name = "Created By:")]
    public AppUser AuthorId { get; set; }
    [Required]
    public string Title { get; set; }
    public string metaTitle { get; set; }
    [Required]
    public string Body { get; set; }
    public bool IsPublished { get; set; } = true;
    public bool IsFeatured { get; set; } = false;
    public DateTime CretedDate { get; set; } = DateTime.Now;
    public DateTime ModifiyDate { get; set; } = DateTime.Now;
    public ICollection<Comment> Comments { get; set; }
    public ICollection<PostTag> Tags { get; set; }
}

public class Tag
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public bool IsPublished { get; set; } = true;
    public DateTime CretedDate { get; set; } = DateTime.Now;
    public DateTime ModifiyDate { get; set; } = DateTime.Now;
    public ICollection<PostTag> PostTag { get; set; }
    public ICollection<Images> Images { get; set; }
}

public class PostTag
{
    public int TagId { get; set; }
    public int PostId { get; set; }
    public Post Post { get; set; }
    public Tag Tag { get; set; }
    public AppUser AppUser { get; set; }
}       
c# asp.net-core entity-framework-core
4个回答
1
投票

您的数据库中似乎已经有一些帖子记录,并且您想将这些帖子附加到标签中。

对于这种情况,您可以先将标签添加到

Tag
表中,然后检索最新插入的标签实体的Id。然后将TagId和PostId插入PostTag表。

参考以下代码:

public async Task<IActionResult> IndexAsync()
{
    List<int> posts = new List<int> { 1, 2, 3 };
    Tag tag = new Tag
    {
        Name = "T1",
        IsPublished = true,
        CretedDate = DateTime.Now,
        ModifiyDate = DateTime.Now
    };

    _context.Tag.Add(tag);
    await _context.SaveChangesAsync();
    int tagId = tag.Id;

    foreach (var item in posts)
    {
        _context.PostTag.Add(new PostTag { TagId = tagId, PostId = item });
        await _context.SaveChangesAsync();
    }

    return View();
}

dbo.帖子:

结果:


0
投票

我猜测

PostTags
Post
Tags
的多对多中间表。我认为您不应该手动更新;构建对象结构更容易,并让实体框架添加中间记录。所以更像是:

 public async Task<IActionResult> Create([Bind("Name,IsPublished,CretedDate,ModifiyDate,posts")] Tag tag, List<int> posts)
    {
    
        if (ModelState.IsValid)
        {
            foreach (var item in posts)
            {
                var post = _dbcontext.Post.Find(item);
                post.Tags.Add(tag);

                await _dbcontext.SaveChangesAsync();
            }
        }

0
投票

该错误表明您正在尝试保存已设置主键的

Tag
实体。这意味着您不会尝试创建
Tag
- 标签已存在于数据库中,您只是将其链接到帖子。

如果是这样的话,那么-

  1. 首先获取现有的
    Tag
    及其
    PostTag
    集合
  2. 将每个新创建的
    PostTag
    添加到现有
    PostTag
    集合
  3. 保存现有的
    Tag
// Fetch existing Tag including its PostTag collection
var existingTag = await context.Tags.Include(p => p.PostTags).FirstOrDefaultAsync(p => p.Id == tag.Id);

foreach (var item in posts)
{
    var existingPost = await context.Posts.FindAsync(item.Id);
    
    // Add to the existing PostTag collection
    existingTag.PostTags.Add(new PostTag { Post = existingPost });
}

// Save existing Tag
await context.SaveChangesAsync();

0
投票
You can  insert like this:

foreach( var menuItems in model.Menulst)
{
   RoleMenuItem item=new RoleMenuItem();
   item.MenuId=menuItems.MenuId;
   item.RoleId=model.Id;
   _roleMenuItemService.Add(item);
}
© www.soinside.com 2019 - 2024. All rights reserved.