我正在使用npgsql驱动程序设置使用EF Core和PostgreSQL配对的应用程序。我在PostgreSQL中使用[jsonb]字段类型,但它仅映射回我的数据模型中的字符串属性。
public class MyModel
{
[Column(TypeName = "jsonb")]
public string JsonData { get; set; }
}
我想将JsonData字段作为Dictionary属性访问。下面的代码有效,但是对JsonDataDictionary而言,每次访问(缓存)时都会对其进行重新构建,这对我来说是浪费的。
public class MyModel
{
[Column(TypeName = "jsonb")]
public string JsonData { get; set; }
public Dictionary<string,string> JsonDataDictionary
{
get
{
return JsonConvert.DeserializeObject<Dictionary<string, string>>(JsonData);
}
}
}
我可以第一次存储反序列化的对象,然后每次返回。但是... JsonData属性可能会发生变化,因此需要重新构建字典。
public class MyModel
{
[Column(TypeName = "jsonb")]
public string JsonData { get; set; }
private Dictionary<string,string> JsonDataDictionary;
public Dictionary<string,string> JsonDataDictionary
{
get
{
if (_JsonDataDictionary == null)
{
_JsonDataDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(JsonData);
}
return _JsonDataDictionary;
}
}
}
我曾考虑过使用某种标志来跟踪JsonData属性的“肮脏性”,但这似乎并不是最佳实践。
public class MyModel
{
private string _JsonData;
private bool _JsonDataChanged = true;
[Column(TypeName = "jsonb")]
public string JsonData
{
get
{
return _JsonData;
}
set
{
_JsonData = value;
_JsonDataChanged = true;
}
}
private Dictionary<string,string> _JsonDataDictionary;
[NotMapped]
public Dictionary<string,string> JsonDataDictionary
{
get
{
if (_JsonDataDictionary == null || _JsonDataChanged)
{
_JsonDataDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(_JsonData);
_JsonDataChanged = false;
}
return _JsonDataDictionary;
}
}
}
有人知道有更好的方法吗?
目标:每次调用字典时都不会运行反序列化。浪费尽可能少的周期。意识到EF Core有时会缓存一堆这样的对象,因此我只希望字典对象在第一次访问时(或JsonData字符串更改时)延迟加载。
我已经阅读了Lazy初始化,但是因为JsonDataDictionary依赖于JsonData字符串,所以我认为Lazy的静态性质不起作用。参见:https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization