我正在使用RavenDB(NoSQL数据库),并且我有这个类:
public class VirtualDirectory
{
public string Id { get; set; }
public string HostAlias { get; set; }
public string VirtualPath { get; set; }
public string IdentificationMethod { get; set; }
public int IsCancelled { get; set; }
}
我正在通过以下方式启动此类的新实例:
VirtualDirectory vd = new VirtualDirectory() { HostAlias = "bla", IsCancelled = 0 };
并通过以下方式保存文档:
using (var session = DbConnection.Instance.DocumentStore.OpenSession(DbName))
{
session.Store(vd);
session.SaveChanges();
}
从我对NoSQL DB文档的了解来看,文档不与模式绑定,因此它们的结构是灵活的。
我的问题是: 如何将数据保存到 RavenDB 数据库,而不在我未设置的字段中获取空值?在最后一段代码之后,我的数据库看起来像:
{
HostAlias : "bla",
VirtualPath : null,
IdentificationMethod : null,
IsCancelled : 0
}
当我得到一个缺少某些字段的 C# 对象(VirtualDirectory 类型)时,例如:
{
HostAlias : "bla",
IsCancelled : 0
}
它会带有空值吗?
用它保存在ravendb中:
store.Conventions.CustomizeJsonSerializer = serializer => serializer.NullValueHandling=NullValueHandling.Ignore;
获取和返回数据:
var config = GlobalConfiguration.Configuration;
var settings = config.Formatters.JsonFormatter.SerializerSettings;
settings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
就个人而言,我不确定为什么您要避免数据库中的空属性。
我喜欢使用 RavenDb,并且拥有 NULL 属性对我来说非常好并且很有帮助。我相信,如果该属性存在于数据库中但不存在于类中(因为您的类“架构”已更改),那么它将忽略该数据库属性/值。
也就是说,您可以告诉 RavenDb 在将某些内容保存到数据库时要做什么。 您可以自定义序列化/反序列化过程。在这里,您想要创建一个自定义
ContractResolver
。
在这种情况下,您需要检查当前值以查看它是否为空。如果是这样,您可以忽略此属性。
所以,这是 150% 未经测试的,只是在快速谷歌搜索后写在这里的。以此作为参考。
public class IgnoreNullValuesContractResolver : DefaultRavenContractResolver
{
public IgnoreNullValuesContractResolver(bool shareCache)
: base(shareCache)
{
}
protected override JsonProperty CreateProperty(MemberInfo member,
MemberSerialization memberSerialization)
{
// Grab the property.
var property = base.CreateProperty(member, memberSerialization);
// Only write this property if the value is NOT null.
// NOTE: I have no idea if this is the correct way to retrieve
// the reflected property and it's value.
property.Writable = ((PropertyInfo) member).GetValue(member, null) != null;
return property;
}
}
我相信 raven 会将您的对象(及其所有属性)映射到 Json 对象并保存它。因此所有 您的对象属性将被保留。
我会创建另一个对象 - 它只有我需要的属性 - 并将其保存到数据库中。
如果将 VirtualDirectory 类保存到 raven - 您将使用 null 值返回它,因为 raven 将实例化您的对象 - 然后填写它具有值的属性。
这有帮助吗?
编辑:
根据您的评论,我做了一个小实验,发现使用“动态”您可以很容易地实现您所需要的。 Raven 会很好地存储它,但它们不会自动聚合到集合中。
听起来怎么样? :P