【发布时间】:2015-08-31 21:04:00
【问题描述】:
我有一个类要使用codefirst ef保存到数据库,如下
public class Book
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int BookId { get; set; }
public string Name { get; set; }
public Dictionary<string, object> Properties { get; set; }
}
它工作正常,除了它不为字典生成任何列。我希望它创建一个 varchar(max) 并且我希望它将我的字典转换为 JSON 并将 JSON 字符串写入列中。
最简单的方法是什么?我想我可以像这样添加一个虚拟字符串...
public string PropertiesJson;
public Dictionary<string, object> Properties
{
get { return JsonConvert.DeserializeObject<Dictionary<string, object>>(PropertiesJson); }
set { PropertiesJson = JsonConvert.SerializeObject(value); }
}
字符串将被写入数据库。然而,这有几个问题。如果有人添加到字典中,字符串可能会变得陈旧,并且逻辑不正确,等等。
而且我想为几个表中的列使用范例,所以我想要一个简单的插件类型。例如,
public PropertyDictionary Properties { get; set; }
其中PropertyDictionary 是EF 会自动执行正确操作的类型。这是最好的方法吗?我该怎么做?
【问题讨论】:
-
如果您需要将 json 保存在数据库中,您可能做错了什么
-
@RoyalBg 我不同意。你不知道情况和原因。我们不必知道。我们只需要一个解决方案。
-
我认为 OP 需要为一本书保留任意属性。我建议一个表格,其中包含
key和value的列以及与本书的关系 -
@RoyalBg,我不会说“错”。有时您确实有一个复杂类型,它是一个值对象,并且您不关心将其序列化表示形式持久保存到数据库中。此外,SQL Server 2016 将原生支持 JSON。
-
好吧,如果它是完全必要的,我的解决方案将是一个字符串列,它是一个属性和一个私有字典属性,它暴露了添加/删除方法。 Add 方法可以追加到字符串,或者序列化不够懒惰的字典。还可以覆盖
SaveChanges()方法,该方法将在调用base.SaveChanges()之前序列化字典
标签: c# json entity-framework