Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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
C# MongoDB:如何在我自己的域类中定义动态实体?_C#_Mongodb_Dynamic - Fatal编程技术网

C# MongoDB:如何在我自己的域类中定义动态实体?

C# MongoDB:如何在我自己的域类中定义动态实体?,c#,mongodb,dynamic,C#,Mongodb,Dynamic,MongoDB的新成员。在VS 2013中建立一个C#web项目 需要将数据作为文档插入MongoDB。每次键值对的数目可能不同 例如, 文档1:Id是“1”,数据是一对键值:“order”:“shoes” 文档2:Id为“2”,数据为3对键值:“订单”:“鞋子”、“包装”:“大”、“国家”:“挪威” 在本文中,“”表示,因为使用自己的域类要容易得多,所以“快速入门”假设您将要这样做。建议将我们自己的课程设置为: public class Entity { public ObjectId

MongoDB的新成员。在VS 2013中建立一个C#web项目

需要将数据作为文档插入MongoDB。每次
键值对的数目可能不同

例如,
文档1:Id是“1”
,数据是一对键值:
“order”:“shoes”

文档2:Id为“2”
,数据为3对键值:
“订单”:“鞋子”、“包装”:“大”、“国家”:“挪威”

在本文中,“”表示,因为使用自己的域类要容易得多,所以“快速入门”假设您将要这样做。建议将我们自己的课程设置为:

public class Entity
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
}
然后像这样使用它:

var entity = new Entity { Name = "Tom" };
...
entity.Name = "Dick";
collection.Save(entity);
嗯,它打破了没有固定栏目的想法,对吗


所以,我想,
BsonDocument
是最适合使用的模型,有适合初学者的好例子吗?

我很惊讶这个话题经常出现。。。本质上,这是一个“静态类型语言限制”,而不是MongoDB问题:

无模式本身并不意味着没有任何模式,它基本上意味着不必预先告诉数据库要存储什么。它基本上是“代码优先”——代码只是像写入RAM一样写入数据库,具有所有的灵活性

当然,典型的应用程序会有某种重复出现的数据结构、一些类、一些面向对象的范例。对于索引也是如此:索引(通常)是“静态”的,因为您必须事先告诉mongodb要索引哪个字段

然而,还有一个用例,您不知道存储什么。如果你的数据真的那么不可预见,那么“代码优先”是有道理的:你会在C#中做什么?您会使用
b音频文档吗?可能不会。也许嵌入的
词典
会起作用,例如

public class Product {
    public ObjectId Id {get;set;}
    public decimal Price {get;set;}
    public Dictionary<string, string> Attributes {get;set;}
    // ...
}
公共类产品{
公共对象Id{get;set;}
公共十进制价格{get;set;}
公共字典属性{get;set;}
// ...
}
此解决方案还可以与一起使用,以使对属性的查询相当快(尽管缺少静态类型使范围查询变得棘手)。看

这取决于你的需要。如果您想要嵌套对象和静态键入,事情会变得比这复杂得多。同样,此类数据结构的使用者(即前端或客户端应用程序)通常需要做出一些假设,以便于消化这些信息,因此通常不可能保证这种类型的安全

其他的选择包括使用
BsonDocument
,我觉得这太有侵入性了,因为您让您的业务模型依赖于数据库驱动程序实现;或者使用一个公共基类,如
ProductAttributes
,可以通过
ProductAttributesShoes
等类进行扩展。这个问题实际上围绕着整个系统设计—您知道编译时的属性吗?前端中是否有属性值的下拉列表?他们来自哪里


如果您想要可重用和灵活的东西,您可以简单地使用JSON库,将对象序列化为字符串并将其存储到数据库中。无论如何,从C#端看,与这些对象的交互都是丑陋的,因为它们不是静态类型。

谢谢您的解释。