在MongoDB C#驱动程序中插入一个包含对另一个实体的引用的实体

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

我对NoSQL数据库很陌生,因为我一直使用SQL。我对如何插入包含对单独文档对象的引用的实体存在问题。根据最佳实践等这是代码(去除了不必要的位)

MongoDB的实体(存储库可以包含许多项目,但是最经常查询,添加,更新和删除的是项目实体,因此没有引用存储库中的项目集合,而是相反)

//entities are not *that* small, each contains several primitive properties
public class Repository 
{
    [BsonId, BsonRepresentation(BsonType.ObjectId)]
    public ObjectId Id { get; set; }
    public string Name { get; set; }
}

public class Project 
{
    [BsonId, BsonRepresentation(BsonType.ObjectId)]
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public ObjectId RepositoryId { get; set; }
}

有一个API端点接受如下所示的DTO:

//DTOs are not *that* small, each contains several primitive properties
public class ProjectDto 
{
    public string Name { get; set; }
    public Repository Repository { get; set; }

}
public class Repository
{
    public string Name { get; set; }
}

控制器接受此ProjectDTO并将其插入数据库,有3个目标]:

  1. 如果ProjectDTO中指定的存储库不存在(基于名称),则需要添加它
  2. 如果存储库已经存在,则需要添加新项目,并且存储库ID应该指向现有存储库
  3. 如果项目已经存在,则只需对其进行更新。该存储库将已经正确分配]
  4. 根据此文档,我应用中的数据库访问发生在服务类中https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-mongo-app?view=aspnetcore-3.0&tabs=visual-studio

现在,问题#1:

将DTO传递给Service类,然后将其映射到实体并执行插入等是一种很好的模式吗?别这样,但是也许:)

无论如何,我都可以通过以下方式实现目标:

  1. 根据名称查找存储库(数据库调用#1)
  2. 如果不存在则添加(数据库调用#2)
  3. 返回现有存储库的ID
  4. 查找现有项目(通过与存储库ID匹配的名称获取项目)(数据库调用#3/4)
  5. 更新是否确实存在(数据库呼叫#4/5)
  6. 将DTO映射到项目实体,并将RepositoryId分配给现有存储库的ID
  7. 将新项目插入项目集合(数据库调用#4/5)
  8. 问题2:

可以吗?

预先致以问候和感谢。

我对NoSQL数据库很陌生,因为我一直使用SQL。我对如何插入包含对单独文档对象的引用的实体存在问题。根据最佳实践等。...

c# mongodb mongodb-.net-driver
1个回答
0
投票

您可以在here中查看mongo文档中的更新。检查IsUpsert选项,我认为它可以实现您想要的功能:

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