我首先使用Entity Framework Code。我有一个简单的模型:
public class Variable
{
public string Name { get; set; }
public int Id { get; set; }
public IList<string> TextOptions
{
get;
set;
}
}
我遇到属性TextOptions
属于List<String>
的问题。
当我尝试在Entity Framework中执行此操作时,它不会映射。
我在这里找到了一个解决方案(stackoverflow)来解决我的问题。我基本上修改了我的类,以便它获取列表并使其成为一个分隔的字符串,而不是持久化:
public class Variable : IVariable
{
public string Name { get; set; }
public int Id { get; set; }
public virtual IList<string> TextOptions
{
get
{
return _TextOptions;
}
set
{
_TextOptions = value;
}
}
private IList<string> _TextOptions;
public string TextOptionsSerialized
{
get
{
return String.Join(";", _TextOptions);
}
set
{
_TextOptions = value.Split(new char[]{';'}, StringSplitOptions.RemoveEmptyEntries).ToList();
}
}
}
此代码工作正常。我遇到的问题是我认为它违反了分离关注。我不认为我的模型类应该关注序列化字符串列表,以便Entity框架可以持久化它。
我遇到了一个在ASP.Net MVC中工作的类似问题。我从客户端发送了一个将映射到模型的帖子。与帖子相比,模型的结构存在一些问题。在MVC中,我可以编写一个Custom Model Binder来以非常安全和可重用的方式处理转换。
我是否有任何方法可以为Entity Framework执行此操作,该方法与自定义模型绑定器适用于MVC一样干净?
答案 0 :(得分:25)
不,EF没有任何类型转换器或自定义类型映射器作为MVC模型绑定器的替代品。你必须总是使用一些黑客来强制持久性。另一种方法是将TextOptions
映射为相关实体的集合。它会使您更好地分离关注点,但会使您的模型复杂化并使用Variable
。
public class Variable
{
public string Name { get; set; }
public int Id { get; set; }
public IList<TextOption> TextOptions
{
get;
set;
}
}
public class TextOption
{
public int Id { get; set; }
public string Text { get; set; }
}
答案 1 :(得分:6)
第三种选择是使用JSON.NET进行序列化。
我使用此线程中列出的3个选项(字符串拆分序列化,JSON.NET和引入实体)为写入方案运行了一些性能测试,并发现JSON.NET产生了最佳性能。
200个相等实体(see source code here and run the test yourself)的初步写入结果:
使用JSON序列化程序的示例:
public class VariableJson
{
public string Name { get; set; }
public int Id { get; set; }
public virtual IList<string> TextOptions
{
get
{
return _TextOptions;
}
set
{
_TextOptions = value;
}
}
private IList<string> _TextOptions;
public string TextOptionsSerialized
{
get
{
return JsonConvert.SerializeObject(_TextOptions);
}
set
{
_TextOptions = JsonConvert.DeserializeObject<IList<string>>(value);
}
}
}