2013-02-02 36 views

回答

10

ORMs(aka abstraction leak)会有这样的问题。该类中的字段将与表中的列相对应。如果使用List或数组,那么ORM将不得不以某种方式将列表中的这些值合并到一个列中,因为它必须选择某种分隔符,以及如果分隔符出现在字符串值中,最终会慢慢找到你自己的兔子洞。

我不认为SQLite-net支持数组/列表。您将需要使用字符串(并根据需要拆分并加入)或创建一个新表来表示一对多关系。

8

为了提供更具体的解决问题的办法,你可以使用Newtonsoft.Json序列化到JSON BLOB:

private string coconutWaterBrands; 

[Ignore] 
public List<string> CoconutWaterBrands { 
    get 
    { 
     return JsonConvert.DeserializeObject<List<string>>(coconutWaterBrands); 
    } 
    set 
    { 
     coconutWaterBrands = JsonConvert.SerializeObject(value); 
    } 
} 
+2

那么可能不是[忽略],或者你需要另一个属性来获取它(序列化)。 – jv42

10

桑迪的答案类似,在序列化/反序列化的列表而言,你可以使用Text blobbed propertiesSQLite-Net Extensions library。因此,例如在你的模型类:

public class SomethingToDoWithCoconuts 
{ 
    [TextBlob(nameof(CoconutWaterBrandsBlobbed))] 
    public List<string> CoconutWaterBrands { get; set; } 
    public string CoconutWaterBrandsBlobbed { get; set; } // serialized CoconutWaterBrands 
} 

documentation on Text blobbed properties:保存和加载时反序列化时

文本blobbed属性被序列化到一个文本属性。这允许将简单对象存储在同一个表中的单个列中。

文本blobbed属性有一个序列化和反序列化对象和一些限制的小开销,但是存储简单对象(如List或Dictionary)的基本类型或简单关系的最佳方法。 文本blobbed属性需要存储序列化对象的声明字符串属性。

文本blobbed属性不能与其他对象建立关系,也不能与其父对象建立反向关系。

如果没有使用TextBlobOperations.SetTextSerializer方法指定其他序列化程序,则使用基于JSON的序列化程序。要使用JSON序列化程序,必须在项目中包含对Newtonsoft Json.Net库的引用,也可以作为NuGet程序包使用。

+6

并且自C#6以来,您还可以编写'[TextBlob(nameof(CoconutWaterBrandsBlondsBlobbed))]',使其更容易出错并且更加可重构。 –

+1

很酷,绝对不容易出错。 –

相关问题