gpt4 book ai didi

c# - 防止嵌套对象的 mongodb c# 驱动程序将 id 序列化为 _id

转载 作者:行者123 更新时间:2023-12-02 02:19:29 25 4
gpt4 key购买 nike

我正在使用 C# mongodb 驱动程序更新 mongodb 中的记录。下面的代码对我来说工作正常,但它会自动将所有出现的“id”转换为“_id”。

var client = GetMongoClient();
var collection1 = GetMongoCollection("collection1");
var collection2 = GetMongoCollection("collection2");

using (var session = await client.StartSessionAsync())
{
session.StartTransaction();

try
{
var filter = Builders<BsonDocument>.Filter.Eq("_id", projectInfo._Id);

BsonDocument projectInfoBD = projectInfo.ToBsonDocument();
var recordAfterUpdate = await collection1.ReplaceOneAsync(session, filter, projectInfoBD);

......
}
catch (Exception ex)
{
await session.AbortTransactionAsync();
return false;
}
}

我的 C# 类(class)

public class ProjectInfo
{
public string _Id { get; set; } //This is primary key which unique for project info
public ProjectBasicDetail BasicDetails { get; set; }
}

public class ProjectBasicDetail
{
public string Name { get; set; }
public string Description { get; set; }
public Option Status { get; set; }
public TextOption CreatedBy { get; set; }
}

public class TextOption
{
public string Id { get; set; } //don't want to convert to "_id"
public string Name { get; set; }
}

public class Option
{
public int Id { get; set; } //don't want to convert to "_id"
public string Name { get; set; }
}

更新记录后,我希望更新后的记录看起来像这样

{
"_id": "kjsldfkjlsdkfjsd",
"basicDetails": {
"name": "test name",
"description": "test desc",
"status": {
"id": 11,
"name": "processing"
},
"createdBy": {
"id": "123",
"name": "some user"
}
}
}

但它保存如下。它将所有出现的“id”转换为我不想要的“_id”

{
"_id": "kjsldfkjlsdkfjsd", //This is ok
"basicDetails": {
"name": "test name",
"description": "test desc",
"status": {
"_id": 11, //This should be "id"
"name": "processing"
},
"createdBy": {
"_id": "123", //This should be "id"
"name": "some user"
}
}
}

提前致谢...

最佳答案

在 Mongo 端,具有 Id 的属性名称被锁定以重命名为 _id

您有 2 个选择。在 C# 端将其称为其他名称,例如 IdStr>

public class TextOption
{
[BsonElement("id")]
public string IdStr { get; set; } //don't want to convert to "_id"
public string Name { get; set; }
}

public class Option
{
[BsonElement("id")]
public int IdStr { get; set; } //don't want to convert to "_id"
public string Name { get; set; }
}

或者调整基础映射>

var client = new MongoClient();
var database = client.GetDatabase("test");
var collection = database.GetCollection<ProjectInfo>("projects");
BsonClassMap.RegisterClassMap<TextOption>(cm =>
{
cm.AutoMap();
cm.UnmapProperty(c => c.Id);
cm.MapMember(c => c.Id)
.SetElementName("id")
.SetOrder(0) //specific to your needs
.SetIsRequired(true); // again specific to your needs
});
BsonClassMap.RegisterClassMap<Option>(cm =>
{
cm.AutoMap();
cm.UnmapProperty(c => c.Id);
cm.MapMember(c => c.Id)
.SetElementName("id")
.SetOrder(0) //specific to your needs
.SetIsRequired(true); // again specific to your needs
});
using (var session = await client.StartSessionAsync())
{
await collection.InsertOneAsync(session,
new ProjectInfo
{
_Id = "604b5fa389ff6887d1b91a91",
BasicDetails = new ProjectBasicDetail
{
CreatedBy = new TextOption { Id = "604b5fa389ff6887d1b91a93", Name = "a" },
Description = "b",
Name = "c",
Status = new Option { Id = 123, Name = "status name" }
}
});
}

同时将 [BsonId] 添加到您的 ProjectInfo 类中,这样它就不会重复,并且具有 string 表示形式>

public class ProjectInfo
{
[BsonId]
public string _Id { get; set; } //This is primary key which unique for project info
public ProjectBasicDetail BasicDetails { get; set; }
}

关于c# - 防止嵌套对象的 mongodb c# 驱动程序将 id 序列化为 _id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66642890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com