我需要使用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类?
答案 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;
}