实体框架代码第一个列表<string>属性映射</string>

时间:2011-11-29 21:08:17

标签: entity-framework model mapping

我首先使用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一样干净?

2 个答案:

答案 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)的初步写入结果:

  • 使用字符串序列化程序写入实体的时间:896毫秒
  • 使用json序列化程序写入实体的时间:516毫秒
  • 使用多个实体写入实体的时间:706毫秒

使用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);                    
        }
    }
}