将任何对象存储为字符串,但作为类型化对象公开或将任何类型的非字符串属性映射到字符串列

时间:2014-07-03 16:58:35

标签: c# entity-framework entity-framework-6

我需要使用EntityFramework在数据库中存储不同的参数。该值需要存储在字符串类型中,但是还有另外一列指定它是否为string,int,double等。

但是,当我从数据库中检索值时,我需要将其映射到有效类型。 简化的类看起来像这样:

public class Parameter
{
    public long Id {get; set;}
    public string Type {get; set;}
}

public class ParameterValues
{
    public long Id {get; set;}
    public virtual Parameter {get;set;}
    public string Value {get;set;}
}

public class Document
{
    public long Id {get; set;}
    public virtual ICollection<ParameterValues> ParameterValues {get;set;}
}

所以,我想我需要编写一个方法来转换数据库中的重新发送的值,但我不知道该怎么做。

我尝试过编写其他类:

public class IntValue : ParameterValue
{
    public new int Value {get;set;}
}

然后我的方法会迭代收集:

private void Convert()
{
    foreach (ParameterValue param in ParameterValues)
    {
        if (param.Parameter.Type == "Int")
        {
            IntParameter intParameter = param;
        }
    }
}

但当然它不会这样。 任何人都知道如何使用正确的值类型将字符串值映射到ParameterValue类?

2 个答案:

答案 0 :(得分:1)

当我需要做这样的事情时,我使用[NotMapped]属性,允许我检索和存储这样的值:

[NotMapped]
public object TypedValue
{
    get 
    { 
       switch(Type)
       {
          case "int":
             return int.Parse(Value); // parse to whatever needed, with a switch
          // ...
       }
    }
    set
    {
      switch(value.GetType)
      {
          case typeof(int):
             Value = // format to allow later parsing
             break;
          // ...
      }
    }
}

有遗漏的细节(例如,空处理)。

但是,最合理的方法是使用序列化程序(JSON,二进制,XML或其他)来序列化和反序列化值,以便避免所有开关(如果你这样做,那么序列化的值)具有允许直接反序列化为正确类型的类型信息。我将公开[NotMapped] object Value属性并包含映射到db列的SerializedValue,而不是格式化和解析,我使用“serialize / deserialize”,类似于示例代码

答案 1 :(得分:0)

如下:

public class Parameter
{
    public long Id {get; set;}
    public string Type {get; set;}
}

public class ParameterValues
{
    public long Id {get; set;}
    public Parameter Parameter {get; set;}
    public string Value {get;set;}

    public ParameterValues(long id, Parameter param, string val)
    {
        Id = id;
        Parameter = param;
        Value = val;
    }
}

public class IntValue : ParameterValues
{
    public IntValue(ParameterValues value)
        : base(value.Id, value.Parameter, value.Value)
    {
    }

    public int GetValue()
    {
        return Int32.Parse(Value);
    }
}

然后转换可能是这样的:

public List<ParameterValues> Convert(List<ParameterValues> values)
{
    var newValues = new List<ParameterValues>();

    foreach (var val in values)
    {
        if (val.Parameter.Type == "Int")
        {
            newValues.Add(new IntValue(val));
        }
    }

    return newValues;
}