Ef Core Sqlite 一对多 - 添加新记录

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

您好,我正在开发一个项目,该项目与微软文档中的关系足够接近:https://learn.microsoft.com/en-us/ef/core/modeling/relationships

public class Blog
{
   public string Id {get;set;} = $"Blog-{Guid.NewGuid()}";
   public string Name {get;set;}
   public ICollection<Post>? Posts {get;set;}
}

public class Post
{
   public string Id {get;set;} = $"Post-{Guid.NewGuid()}";
   public string Name {get;set;}
   public required Blog Blog {get;set;}
}

当我想向数据库添加新帖子时,我有一个表单,作者可以从下拉列表中选择他们要发布到的博客,然后创建新帖子。

到目前为止,为了避免与 Blog 对象相关的唯一约束出现错误,我所做的是:

public void AddPost(Post newPost)
{
    var blog = _context.Blogs
      .Include(b => b.Posts)
      .FirstOrDefault(b => b.Id == newPost.Blog.Id);

    blog.Posts ??= new List<Post>();
    blog.Posts.Add(newPost);

    _context.Blogs.Update(blog);
    _context.SaveChanges();
}

是否可以在将 newPost 插入 Posts 表之前避免从 Blogs 表获取博客?我最初认为如果我添加了新帖子,EF core 只会将该帖子添加到相关的 Blog 对象,但它会尝试在 Blog 表中再次创建博客,从而给出唯一约束错误。

所以问题是,这是应该这样做的,还是有更好的方法?

c# .net sqlite entity-framework-core blazor-webassembly
1个回答
0
投票

您当前从数据库加载博客然后向其中添加新帖子的方法是处理这种情况的有效且常见的方法。它确保您拥有对新帖子应属于的博客实体的有效引用并正确建立关系。

但是,如果您想避免显式从数据库加载博客,您可以执行以下操作:

  1. 创建一个分离的 Blog 实体并设置其 Id 属性以匹配 newPost 对象中的 Blog Id。

  2. 将分离的博客实体附加到上下文或将其状态设置为未更改。

  3. 将 newPost 添加到上下文中。 以下是如何修改 AddPost 方法来实现此目的的示例:

    public void AddPost(发布新帖子) { var blog = new Blog { Id = newPost.Blog.Id }; // 使用相同的 ID 创建一个独立的博客

    // 将分离的 Blog 实体附加到上下文,将其标记为 Unchanged _context.Attach(博客);

    // 将新帖子添加到上下文中 _context.Add(newPost);

    _context.SaveChanges(); }

© www.soinside.com 2019 - 2024. All rights reserved.