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

Mik*_*num 23 mapping entity-framework model

我首先使用Entity Framework Code.我有一个简单的模型:

public class Variable
{
    public string Name { get; set; }

    public int Id { get; set; }

    public IList<string> TextOptions
    {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到了属性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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常.我遇到的问题是我认为它违反了分离关注.我不认为我的模型类应该关注序列化字符串列表,以便Entity框架可以持久化它.

我在ASP.Net MVC中遇到了类似的问题.我从客户端发送了一个将映射到模型的帖子.与帖子相比,模型的结构存在一些问题.在MVC中,我可以编写自定义模型绑定器,以非常安全和可重用的方式处理转换.

是否有任何方法可以为Entity Framework执行此操作,与自定义模型绑定器适用于MVC一样干净?

Lad*_*nka 26

不,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; }
}
Run Code Online (Sandbox Code Playgroud)

  • 我只想补充一点,你不能对EF感到失望.它是由关系数据模型和面向对象数据模型之间的固有差异带来的限制.不同的概念. (5认同)
  • @KellySandwiches从`List <string>`到具有`id`和`value`的表的映射非常简单和通用,可以由EF自动完成,对吧? (4认同)
  • 感谢您的答复.很遗憾听到它!关于代码的整个声明似乎只是朝着正确的方向迈出了一步.我不能创建与EF无关的模型,除非它们像模型绑定器一样提供SOMETHING. (2认同)

Mau*_*les 7

第三种选择是使用JSON.NET进行序列化.

我使用此线程中列出的3个选项(字符串拆分序列化,JSON.NET和引入实体)为写入方案运行了一些性能测试,并发现JSON.NET产生了最佳性能.

200个相等实体的初步写入结果(请参阅此处的源代码并自行运行测试):

  • 使用字符串序列化器写入实体的时间: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);                    
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我想知道如果列表中只有2个或3个字符串,相对性能是否不同.一万个呢? (3认同)