我的poco课程如下;
public class FilterParameter
{
public int Id { get; set; }
[Required]
public virtual UserFeatureSetting UserFeatureSetting { get; set; }
[Required]
[MaxLength(450)]
public String ParameterName { get; set; }
public object ParameterValue { get; set; }
}
但生成的迁移代码未创建ParameterValue字段。
CreateTable("dbo.FilterParameters", c => new {
Id = c.Int(nullable: false, identity: true),
ParameterName = c.String(nullable: false, maxLength: 450),
UserFeatureSetting_Id = c.Int(nullable: false),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.UserFeatureSettings", t => t.UserFeatureSetting_Id, cascadeDelete: false)
.Index(t => t.UserFeatureSetting_Id);
我应该使用另一种类型 - 或者是一种解决方法吗?
答案 0 :(得分:1)
实体框架将.Net类型映射到SQL类型。
您不应该使用System.Object
,因为EF不知道将其映射到哪种SQL类型。
它并不理想,但如果您确实需要在数据库中包含任何对象的列,请使用string ParameterValue
并在从数据库加载时转换该值。如果需要,您还可以添加一个新字段string ParameterValueType
,您可以在其中保存值的类型以帮助您将其转换回来。
答案 1 :(得分:1)
通常做的是例如
// define your 'real field' as string, byte[] and/or define column type ntext, binary etc.
public string Value {get;set;}
// and make a wrapper property
[NotMapped]
public object ValueWrapper
{
get { return YourParser.Deserialize(this.Value); }
set { this.Value = value.Serialize(); }
}
...并使用一些解析器/格式化程序 - 某种类型的序列化(取决于你所拥有的是更好的文本,blob,xml等)。
如果昂贵等等,您当然应该“缓存”反序列化值。
此外,您可能需要也可能不需要存储ParameterType
- 这基本上取决于您的对象和序列化格式。
e.g。 EF / code-first使用二进制文件将Edmx模型存储到__MigrationHistory
表中 - 它们使用相同的方法(仅低级)。
如果你每次只需要保存/加载不同的“基本类型”(比如一次是int,另一次是文本等)
...那么你可能会有更多选择(继承可能等等) - 但我没有什么建议 我更喜欢第一种方法而不是其他方法,因为这种数据在关系方面可能无法使用,因此大多数时候存储它并不重要。
答案 2 :(得分:0)
我认为您可以使用Dictionary<string, string>
作为.NET数据类型在域模型中使用,并以json格式保存/加载时对其进行取消/序列化,这是明文,您可以检查内容在Sql Server中甚至更改它。
很高兴看到你前进: - )