在EF中定义逗号分隔的字符串并与Linq一起使用

时间:2014-07-30 12:26:15

标签: linq entity-framework

我正在尝试定义包含<string>列表或数组的EF模型。使用Add-Migration / Update-Database,该字段不会添加到数据库表中。

我想要的是一个包含以逗号分隔的字符串值列表的字段。可能只有一个值,或者可能有10个或更多:

"Value1, Value2, ..."

我希望能够在我的MVC5 / EF6 Web应用程序中使用此字段作为密钥。例如:

IEnumerable<Param> params = 
    from u in _context.Params
    where u.MyValues.Contains("Value1") 
    select u;

我知道这段代码是错误的,但这是我正在尝试的内容:

public class Param
{
    public int Id { get; set; }
    public string[] MyValues { get; set; }
}

我的DbSet:

public DbSet<Param> Params { get; set; }

MyValues字段未添加到架构中,并且没有抛出任何错误。这是Seed():

context.Params.Add(c => c.Id, new Param { MyValues = new[] { "Value1, Value2" } });

如何添加一个包含逗号分隔的字符串值列表的字段,然后可以对其进行访问/查询?

1 个答案:

答案 0 :(得分:2)

截至目前,EF不支持自定义转换(可能 EF 7 将......),因此您必须添加一些管道。

这是我通常做的事情(可能还有其他更好的方法......):

private string myValuesAsString;
[Column("MyValues")]
public string MyValuesAsString
{
    get { return myValuesAsString; }
    set
    {
        myValuesAsString = value;
        myValues = value.Split(',');
    }
}

private string[] myValues;
[NotMapped]
public string[] MyValues
{
    get { return myValues; }
    set
    {
        myValues= value;
        myValuesAsString = string.Join(",", value);
    }
}

未经测试,但您明白了。

如果您不想将公共属性添加到您的业务实体,您可以:

  • 从您的POCO业务实体继承
  • 使用内部属性,但必须使用 fluent API
  • 进行映射
  • 使用接口进行完美抽象