如果我想用POCO读取和编写mongo数据
public class Thingy
{
public string Foo {get;set;}
}
...
coll.Insert(new Thing(Foo = "hello"));
当我回读时,我得到一个失败,说_id是一个意外的属性(它是)。然后我在课堂上添加了一个名为_id的字段。现在插入不起作用,说_id字段不能为null。一个尝试过的BsonIgnoreIfNull属性,它没有用。
答案 0 :(得分:56)
当您插入对象时,如果它没有_id
字段,则驱动程序会添加一个并将其设置为12字节的MongoDB ObjectId值。
您只需要在POCO中添加Id
属性,该属性将从_id
反序列化:
public class Thingy
{
public ObjectId Id { get; set; }
}
或者,如果您想委托另一个属性映射到_id
,那么您可以使用BsonIdAttribute
进行装饰,如下所示:
[BsonId]
public ObjectId MyKey { get; set; }
_id
字段不一定是MongoDB ObjectId
,您可以将其设置为任何数据类型的任何值(数组除外),它只需要在集合中是唯一的
答案 1 :(得分:9)
您必须为id添加属性(或字段)并告诉序列化程序您要使用哪个ID生成器。
[BsonId(IdGenerator = typeof(ObjectIdGenerator))]
public object ThingyId { get; set; }
MongoDb驱动程序中有3个可用,或者您可以编写自己的驱动程序。有关详情,请访问http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorial-WriteacustomIdgenerator
答案 2 :(得分:2)
我通常包裹着Thingy:
class MeasurementUnit(Base):
__tablename__ = "measurement_units"
id = Column(Integer, primary_key=True)
code = Column(String, unique=True)
long_name = Column(String)
siunitx = Column(String)
它使得它变得更容易,因为Thingy类经常来自我无法控制的不同库。它也更容易反序列化,以便将其移交给其他人进行处理。
答案 3 :(得分:1)
添加如下属性:
public BsonObjectId Id { get; set; }
MongoDB驱动程序会在序列化\反序列化期间自动将Id
转换为_id
。
答案 4 :(得分:0)
public class Thingy
{
public ObjectId Id { get; set; }
public string Foo { get; set; }
}
根据班级
如果需要,请使用以下代码:
var collection = database.GetCollection<Thingy>("db_Thingy");
Thingy tg= new Thingy();
tg.Foo = "Hello";
collection.insert(tg);