Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用POCO和mongodb c#驱动程序时如何管理_id字段_C#_Mongodb_Poco - Fatal编程技术网

使用POCO和mongodb c#驱动程序时如何管理_id字段

使用POCO和mongodb c#驱动程序时如何管理_id字段,c#,mongodb,poco,C#,Mongodb,Poco,如果我想用POCO读写mongo数据 public class Thingy { public string Foo {get;set;} } ... coll.Insert(new Thing(Foo = "hello")); 当我回读时,我得到一个失败的消息,说_id是一个意外的属性(事实就是这样)。然后我在类中添加了一个名为_id的字段。现在,插入不起作用,说明_id字段不能为null。尝试使用的BsonIgnoreIfNull属性无效。按如下方式添加属性: public Bs

如果我想用POCO读写mongo数据

public class Thingy
{
     public string Foo {get;set;}
}
...
coll.Insert(new Thing(Foo = "hello"));

当我回读时,我得到一个失败的消息,说_id是一个意外的属性(事实就是这样)。然后我在类中添加了一个名为_id的字段。现在,插入不起作用,说明_id字段不能为null。尝试使用的BsonIgnoreIfNull属性无效。

按如下方式添加属性:

public BsonObjectId Id { get; set; }

在序列化\反序列化期间,MongoDB驱动程序会自动将
Id
转换为
\u Id

插入对象时,如果对象没有
\u Id
字段,则驱动程序会添加一个并将其设置为12字节的MongoDB值

您只需向POCO添加一个
Id
属性,该属性将从
\u Id
反序列化:

public class Thingy
{
     public ObjectId Id { get; set; }
}
或者,如果要将另一个属性委派到映射到
\u id
,则可以使用
BsonIdAttribute
对其进行装饰,如下所示:

[BsonId]
public ObjectId MyKey { get; set; }   

\u id
字段不必是MongoDB
ObjectId
,您可以将其设置为任何数据类型的任何值(数组除外),它只需要在集合中是唯一的。

您必须为id添加属性(或字段),并告诉序列化程序要使用哪个id生成器

[BsonId(IdGenerator = typeof(ObjectIdGenerator))]
public object ThingyId { get; set; }
MongoDb驱动程序中有3个可用版本,您也可以自己编写。更多信息请访问

按班

如果需要,请使用以下代码:

var collection = database.GetCollection<Thingy>("db_Thingy");
Thingy tg= new Thingy();
tg.Foo = "Hello";
collection.insert(tg);
var collection=database.GetCollection(“db_Thingy”);
Thingy tg=新的Thingy();
tg.Foo=“你好”;
收集.插入(tg);

我通常会把东西包起来:

public class MongoThingy
{
    public ObjectId Id { get; set; }
    public Thingy Thingy { get; set; }
}

这让它变得容易多了,因为很多时候,类内容来自于我无法控制的不同库。反序列化也更容易,以便将其交给其他人处理。

thx-我感觉有一组文档、样本或我缺少的东西:-)@Bryan Migliorisi-这不起作用。插入(或保存)失败,告诉我无法保存Idnull@BryanMigliorisi-mongodb git站点的官方c#驱动程序,昨天下载的Id属性的数据类型应该是ObjectId,而不是BsonObjectId。虽然BsonObjectId看起来也很合理,所以我将创建JIRA请求来支持它。很有趣。。。Robert,我对代码中的每个实体都使用了BsonObjectId,使用驱动程序时没有任何问题。+1作为最后解释,即可以将_id设置为任何数据类型的任何值(数组除外)。关于这一点的官方文件[解释][解释][解释]让我有点困惑,我为此奋斗了两天。谢谢@Chris Fulstow,这是一个晦涩但关键的功能!强调_id字段不必是MongoDB ObjectId。如果您使用的是ObjectId或Bson属性,那么您的对象就不再是POCO(普通的旧CLR对象),所以实际上,这就是答案。尽可能避免使用它们。@ChadHedgcock我在这里跟着你。但是,如果我的poco类中没有任何与此对应的属性,则在加载文档时会出现错误。比如“_idcouldtomap to anything”@Jepzen在游戏中有点晚了,但是class属性[BsonIgnoreExtraElements]可能会解决这个问题。这个链接现在似乎已经断了。
public class MongoThingy
{
    public ObjectId Id { get; set; }
    public Thingy Thingy { get; set; }
}