我无法让我的模型将实体的Id属性表示为字符串,但是将其自动生成并由MongoDb在内部表示为本机ObjectId.
class Account
{
public string Id { get; set; }
...
}
class AccountStore
{
static AccountStore()
{
BsonClassMap.RegisterClassMap<Account>(cm =>
{
cm.AutoMap();
cm.SetIgnoreExtraElements(true);
// map Id property here
});
}
public void Save(Account account)
{
_accounts.Save(account);
}
}
Run Code Online (Sandbox Code Playgroud)
对于// map Id property here上面代码中的行,我尝试了许多不同的配置Id映射的方法,但没有一种方法有效.我尝试过的方法以及调用Save方法时抛出的相关异常是:
// Exception: No IdGenerator found.
cm.IdMemberMap
.SetRepresentation(BsonType.ObjectId);
// Exception: No IdGenerator found.
cm.IdMemberMap
.SetRepresentation(BsonType.String);
// Exception: Unable to cast object of type 'MongoDB.Bson.ObjectId' to type 'System.String'.
cm.IdMemberMap
.SetRepresentation(BsonType.ObjectId) …Run Code Online (Sandbox Code Playgroud) 我是mongodb的新手,我很喜欢不用担心架构的问题,我有一个问题,假设你想在mongo中使用Id属性而mongo ObjectId用来表示属性Id,到目前为止我看到你可以拥有或装饰一个Id作为如下,
public ObjectId Id {get; set;}
//or
[BsonId]
public string Id {get; set;}
//or
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id {get; set;}
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释为什么大多数人选择最后一种类型,以及最新情况以及灵活性如何帮助.谢谢?
我将 MongoDB 与 C# 官方 MongoDb 驱动程序一起使用。
我的域对象都有一个字符串类型的 Id 属性
string Id { get; set;}
Run Code Online (Sandbox Code Playgroud)
但我想在实际数据库中存储 12 字节的二进制 ObjectId,这是在类映射中实现的,如下所示:
BsonClassMap.RegisterClassMap<X>(cm => {
cm.AutoMap();
cm.GetMemberMap(c => c.Id).SetRepresentation(BsonType.ObjectId);
});
Run Code Online (Sandbox Code Playgroud)
其他集合的外部 ObjectId 键也表示为字符串,并且也应保存为对象 ID。
现在,如果可以避免的话,我不想为每个 Id 和外键编写相同的 SetRepresenttion 内容。
那么有没有一种方法可以一劳永逸地说,所有字符串 Id 字段都应该在数据库中表示为 ObjectId,并且所有名称以“Id”结尾的字符串属性也应该在数据库中表示为 ObjectId?
我已经更改了所有 C# 实体:
public ObjectId Id { get; set; }
Run Code Online (Sandbox Code Playgroud)
对此:
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
Run Code Online (Sandbox Code Playgroud)
因为我需要使用 Rebus 并发送 Id,但如果不添加自定义序列化程序,则 ObjectId 不可序列化。实际上字符串在其他地方更方便(例如:MVC 控制器中的模型绑定)。
无论如何,我认为更改不会有问题,但现在我尝试将 ObjectId 反序列化为字符串时遇到异常:我的 ApplicationUser 类有一个
IEnumerable<string> Friendships { get; set; }
Run Code Online (Sandbox Code Playgroud)
包含来自友谊实体的 Id 列表。它们是作为 ObjectId 创建的,但现在我想将它们作为字符串处理...我现在如何在代码中处理它?