C# MongoDB:如何在我自己的域类中定义动态实体?
MongoDB的新成员。在VS 2013中建立一个C#web项目 需要将数据作为文档插入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
键值对的数目可能不同
例如,
文档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#端看,与这些对象的交互都是丑陋的,因为它们不是静态类型。谢谢您的解释。