c# -无Sql数据库与动态对象通知

本文关键字:动态 对象 通知 数据库 Sql | 更新日期: 2023-09-27 18:12:48

我正在考虑使用NO SQL数据库,如MongoDb, RavenDb或任何其他建议我会考虑。

关于我下面的问题,有人能给我一些建议、教程和有用的链接吗?

我想写的这个系统必须是动态的,例如模型可能会改变分配,不应该在c#中硬编码。

例如,如果我有一个JSON文档保存ID, NAME, FULL NAME,然后添加一个名为PHONENUMBER的属性,我不想重建c#代码或重新部署。

是否可以从动态JSON中构建c#模型?然后能够操纵它吗?

如果是的话,对于这种类型的系统最推荐什么库?哪些库最适合。net ?

这个问题是我开始大学项目的一个步骤。

感谢帮助&建议。

c# -无Sql数据库与动态对象通知

是的,使用RavenDB可以很容易地做到这一点。有两种方法。你可以使用一个完全动态的模型,利用c# dynamic关键字。这可以让你做任何你想做的事情,包括在运行时添加属性,查询运行时属性等。

然而,更常见的设置是,您将使用许多常见属性(例如,客户必须有一个名称)。所以你会得到一个像这样的模型:

public class Customer
{
       public string Id {get;set;}
       public string Name {get;set;}
       public dynamic Props {get;set;}
}

固定属性是用c#编码的,这有助于您进入一个更容易,更一致的模型,并使用所有常用的编译工具。动态内容在Props属性中(通常初始化为ExpandoObject)。

注意,你不能使用dynamic执行linq查询。这是c#的限制,而不是RavenDB。您仍然可以使用RavenDB进行动态查询,但是您必须使用基于字符串的查询API。

我实现了Json。. NET序列化器包装器可以帮助您:

https://github.com/welegan/RedisSessionProvider/blob/master/RedisSessionProvider/Serialization/RedisJSONSerializer.cs

我在我的库中使用它来存储ASP的内容。. NET的Session对象在Redis内部,这是一个NoSQL选项,你没有提到。尽管如此,考虑到Json的无类型特性,我认为无论您选择哪种NoSQL数据库,它都将适用于您的需求。基本步骤如下:

序列化:

  1. 决定一个分隔符(我可能会选择一个更好的)

  2. 存储类型信息(您可以缓存它以提高性能)

  3. 将对象数据存储在分隔符

  4. 之后

反序列化:

  1. 查找类型info直到分隔符

  2. 反序列化Type对象

  3. Type以及对象数据传递到您选择的库。至少是Json。. NET和ServiceStack。

编辑

我似乎误解了你问题的一部分。您希望能够在不重新部署c#的情况下支持添加json属性,我的示例将在返回noSql数据库的序列化步骤中剥离额外的属性。您可以使用Dictionary<string, string>ExpandoObject,就像ayende或mxmissile建议的那样,但请记住,这样您将无法保证获得的对象的属性类型。

换句话说,您可以自由地添加属性名称,但是一旦您将属性的类型从int更改为long,您的代码就会意外中断。根据您的用例,这可能重要,也可能不重要,只是要记住一些东西。

是的,使用字典。但是,我不确定这些数据库系统是如何处理字典的。优雅与否

不,c#已经编译好了,所以一旦编译好了,如果不修改源代码并再次编译,就不能修改它。我认为你应该添加一些Javascript,因为这是JS的强项。