MongoDB c# 驱动程序 - 名为 Id 的字段可以不是 Id 吗?
更具体地说,有一个类
class X {
....
string Id { get; set; }
}
class Y : X {
ObjectId MyId { get; set; }
}
我希望 MyId 成为 Y 的 id,即映射到 _id。
是否可以?
在这段代码之后我得到一个异常:
var ys = database.GetCollection("ys");
ys.InsertBatch(new Y[] { new Y(), new Y()});
异常: {“类 'MongoTest1.Y' 的成员 'MyId' 不能使用元素名称 '_id',因为它已被成员 'Id' 使用。”}
完整测试用例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Driver;
namespace MongoTest1
{
class X
{
public string Id { get; set; }
}
class Y : X
{
public ObjectId MyId { get; set; }
}
class Program
{
static Program() {
BsonClassMap.RegisterClassMap<X>(cm =>
{
cm.AutoMap();
cm.SetIdMember(cm.GetMemberMap(c => c.Id));
});
BsonClassMap.RegisterClassMap<Y>(cm =>
{
cm.AutoMap();
cm.SetIdMember(cm.GetMemberMap(c => c.MyId));
});
}
static void Main(string[] args)
{
var server = MongoServer.Create("mongodb://evgeny:evgeny@localhost:27017/test");
var database = server.GetDatabase("test");
using (server.RequestStart(database))
{
var ys = database.GetCollection("ys");
ys.InsertBatch(
new Y[] {
new Y(), new Y()
}
);
}
}
}
}
X 的 Id 必须是字符串。
More particulary, there is a class
class X {
....
string Id { get; set; }
}
class Y : X {
ObjectId MyId { get; set; }
}
I would like MyId to be an id for Y, i.e. to be mapped to _id.
Is it possible?
I get an exception after this code:
var ys = database.GetCollection("ys");
ys.InsertBatch(new Y[] { new Y(), new Y()});
The exception:
{"Member 'MyId' of class 'MongoTest1.Y' cannot use element name '_id' because it is already being used by member 'Id'."}
Full test case:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Driver;
namespace MongoTest1
{
class X
{
public string Id { get; set; }
}
class Y : X
{
public ObjectId MyId { get; set; }
}
class Program
{
static Program() {
BsonClassMap.RegisterClassMap<X>(cm =>
{
cm.AutoMap();
cm.SetIdMember(cm.GetMemberMap(c => c.Id));
});
BsonClassMap.RegisterClassMap<Y>(cm =>
{
cm.AutoMap();
cm.SetIdMember(cm.GetMemberMap(c => c.MyId));
});
}
static void Main(string[] args)
{
var server = MongoServer.Create("mongodb://evgeny:evgeny@localhost:27017/test");
var database = server.GetDatabase("test");
using (server.RequestStart(database))
{
var ys = database.GetCollection("ys");
ys.InsertBatch(
new Y[] {
new Y(), new Y()
}
);
}
}
}
}
X's Id MUST be string.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你的问题的答案是“是的,但是......”。
可能有一个名为 Id 的成员未映射到 _id 元素。例如:
但是,在类层次结构中,_id 成员必须位于层次结构的根部(换句话说,层次结构的所有成员必须同意使用相同的 _id)。
The answer to your question is "yes, but...".
It is possible to have a member called Id which is not mapped to the _id element. For example:
However, in a class hierarchy the _id member must be at the root of the hierarchy (in other words, all members of the hierarchy must agree on using the same _id).