EF Core 5.0 - 更新 ASP.NET Core Web API 中的多对多实体

2023-12-12

EF Core 5.0 引入了多对多关系。我陷入了如何通过我的 asp .net api 更新它们的困境。

对于一对一和一对多关系,有一个约定,只需添加属性名称后跟 ID。

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public BlogImage BlogImage { get; set; }
}

public class BlogImage
{
    public int BlogImageId { get; set; }
    public byte[] Image { get; set; }
    public string Caption { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

所以一个正确的 POST 请求可能看起来像

{
  "BlogId": 123,
  "Url": "example.com",
  "BlogImageID": 42
}

但我不知道是否有约定或多对多关系的样子

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; }
}

是否存在使用 EF 5.0 将 http 请求正文映射到多对多关系的约定?


考虑以下两个处于多对多关系的实体 -

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }

    public ICollection<Tag> Tags { get; set; }
}

public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<Post> Posts { get; set; }
}

更新时Tags in a Post实体,在最常见的场景中,一个新的标签列表Ids 从客户端发送,请求负载将如下所示 -

{
    "id": 123,
    "title": "An Awesome Post",
    "tags": [2, 7, 13]
}

通常,您需要定义一个 DTO 来表示此请求对象,例如 -

public class PostUpdateDTO
{
    public int Id { get; set; }
    public string Title { get; set; }

    public List<int> Tags { get; set; }
}

然后,对于更新操作本身,您可以执行类似的操作 -

[HttpPut]
public async Task Put([FromBody]PostUpdateDTO dto)
{
    // fetch existing Post including related Tags
    var post = await _DbCtx.Posts
        .Include(p => p.Tags)
        .FirstOrDefaultAsync(p => p.Id == dto.Post.Id);

    // remove all Tags from the existing list
    post.Tags.Clear();
    
    // add new Tags to the list whose Ids are sent by the client
    // but to identify them you need the list of all available tags
    var availableTags = await _DbCtx.Tags.ToListAsync();
    foreach (var id in dto.Tags)
    {
        post.Tags.Add(availableTags.First(p => p.Id == id));
    }
    
    // modify properties of Post if you need, like -
    // post.Title = dto.Title;

    await _DbCtx.SaveChangesAsync();
}

正如您所看到的,这需要访问数据库来获取所有可用的列表Tag。如果您不喜欢这样并想跳过它,您可以尝试以下方法 -

[HttpPut]
public async Task Put([FromBody]PostUpdateDTO dto)
{
    // fetch existing Post including related Tags
    var post = await _DbCtx.Posts
        .Include(p => p.Tags)
        .FirstOrDefaultAsync(p => p.Id == dto.Post.Id);

    // remove Tags which are in the existing Tag list, but not 
    // in the new list sent by the client
    post.Tags.Where(tag => !dto.Tags.Any(id => id == tag.Id))
        .ToList().ForEach(tag => post.Tags.Remove(tag));

    // add Tags which are in the new list sent by the client, but 
    // not in the existing Tag list
    dto.Tags.Where(id => !post.Tags.Any(tag => tag.Id == id))
        .ToList().ForEach(id => post.Tags.Add(new Tag { Id = id }));

    // modify properties of Post if you need, like -
    // post.Title = dto.Title;

    await _DbCtx.SaveChangesAsync();
}

关于那个 -属性名称后跟 ID :
您所指的 Id 属性代表外键。这两个实体都不包含外键属性,因为它们都不依赖于对方。外键意味着父/子或委托/依赖关系。但当两个实体存在多对多关系时,它们是相互独立的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF Core 5.0 - 更新 ASP.NET Core Web API 中的多对多实体 的相关文章

  • 按成员序列化

    我已经实现了template
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur

随机推荐

  • 如何在 JavaFX TextField 中设置对齐方式?

    我需要将 TextField 中的文本设置为右对齐 TextField下没有这个 有人知道如何在 javaFX 2 0 中的文本字段中设置对齐方式吗 Thanks 在 JavaFX 2 0 中 这可能是不可能的 但它is在 JavaFX 2
  • Django IntegrityError 电子邮件不是唯一的

    我正在与普通 来宾用户一起处理我的结帐视图 但很难解决完整性错误 想法是让访客用户仅使用电子邮件注册才能结帐 我需要将用户电子邮件设置为唯一 模型 py from django conf import settings from djang
  • 如何使用 Gnuplot 生成绘图,其中每行的第 1 列用作键?

    我目前有 set terminal png set datafile separator set style data linespoints set key plot data forplotting population csv usi
  • 核心数据最大实体数量

    我正在开发一个使用核心数据的应用程序 我已经尝试过对一个实体执行此操作 但没有成功 但我现在有大约二十个实体 我的问题是 实体数量或推荐数量是否有限制 有没有更好的方法来存储这么多数据 UPDATE 我存储的是学校的毕业生 但不是 A b
  • vtkOBJReader 将 OBJ 作为单独的 vtkPolyData 对象导入

    我的目的是获得 vtkPolyData 通过 vtk OBJ 导入实现理想的颜色 纹理 传递给 k3d 查看器使用 k3d vtk poly data
  • 如何将单维索引转换为多维数组中的相应索引?

    假设我有一个 3x4x5x6 java 双精度数组a我展开到 ArrayList 中b长度为 360 的方式如下 for int i 0 i
  • C#:将 DataTable 绑定到 GridView 时更改列的顺序

    如何更改数据表中列的显示顺序 例如 数据表 dt 包含两列 a 和 b 我将它绑定到 GridView 如下所示 gridView DataSource dt gridView DataBind 但我希望 GridView 首先显示 b 最
  • 如何加速 VBA 宏

    我正在使用宏生成新工作表 对于新工作表生成 数据是从 4 个以上的 MS Access DB 中检索的 每个 DB 至少有 200 个字段 我的宏代码包括 1 Cell locking 2 Alignment and formatting
  • 如何在 Xamarin Forms(Android 和 iOS)中实现 Google 地图? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我有一个 Google 地图 API 密钥 我想用它来使用 Xamarin Forms 在我的 Android 应用程序和 iOS 应用程序中显示地图 您会使用哪个库来减少两个操
  • 检查样式配置中的 IntelliJ IDEA 代码格式

    我决定为 android maven 插件做出贡献 他们使用非常特定的代码风格格式 我需要一些时间来修改IDEA代码格式规则以满足他们的要求 幸运的是有 checkstyle 配置 我已经为 IDEA 安装了检查式插件 并立即看到我当前的格
  • 如何删除 psql(PostgreSQL 交互式终端)中以常用单词开头的所有表?

    如何删除名称开头的所有表 例如doors 我可以使用某种正则表达式吗drop table命令 我不喜欢编写自定义脚本 但欢迎所有解决方案 谢谢 该脚本将生成 DDL 命令来删除它们 SELECT DROP TABLE t oid regcl
  • 在圆形数组中搜索

    在圆形数组中搜索的最佳方法是什么 Example 1 array 45 67 44 11 49 4 56 12 39 90 circular array 11 49 4 56 12 39 90 45 67 二分搜索是正确的开始方法吗 二分查
  • IntelliJ IDEA 仅运行突出显示的代码

    如何仅在 IntelliJ IDEA 中运行突出显示的代码 有时您不需要运行整个文件 而只想运行某些数量的代码 IntelliJ IDEA中有这样的选择吗 有可能计算任意表达式 Run Evaluate Expression 要评估代码片段
  • 表格大小与页面布局

    我在 Oracle Linux Server 6 3 版上使用 PostgreSQL 9 2 根据存储布局文档 页面布局包含 页头数据 24 字节 n 项 索引项 表项 的点数 AKA ItemIdData 4 字节 可用空间 n 个项目
  • Java - PaintComponent 中的 MouseListener 操作事件

    这里我有一个代码 它使用paintComponent在鼠标单击的位置上绘制一个矩形 我可以获得输出消息 但与图形和 draw 相关的任何内容都不起作用 Code import java awt import java awt event i
  • 仅解码 URL 非 ascii 字符

    现在我正在研究维基百科 在很多文章中 我注意到一些网址 例如 https www google com search q 26 E0 B8 89 E0 B8 B1 E0 B8 99 都很长 示例 URL 可以替换为 https www go
  • WPF UserControl 不继承父 DataContext

    我正在尝试开发一个可重用的用户控件 但遇到了绑定问题 我创建了一个较小的应用程序来测试它 但无法解决它 或者至少无法理解为什么它没有按照我的预期工作 代码如下 我期望的是我放在 MainWindow xaml 上的 TestUserCont
  • 转换颜色以模仿灰度打印

    读书时这个问题 我开始思考是否可以转换颜色来模仿普通的灰度打印机 假设您的屏幕已校准 找到一个可认可的近似值可以节省纸张 例如 如何转换这些颜色 看看在纸上是否可以区分浅蓝色和深蓝色和红色 temp lt rgb2hsv 239 138 9
  • 使用accepts_nested_attributes_for创建新记录或更新现有记录

    阅读重大更新以获取最新信息 嘿大家 我在 Rails 应用程序中有一个多对多关系 涉及三个表 用户表 兴趣表和连接 user interests 表 该表也有一个评级值 以便用户可以对他们的每个兴趣进行评级1 10 级 我基本上是在寻找一种
  • EF Core 5.0 - 更新 ASP.NET Core Web API 中的多对多实体

    EF Core 5 0 引入了多对多关系 我陷入了如何通过我的 asp net api 更新它们的困境 对于一对一和一对多关系 有一个约定 只需添加属性名称后跟 ID public class Blog public int BlogId