我应该如何定义一个可以接受EF中各种数据类型的字段?
本文关键字:EF 数据类型 字段 何定义 定义 我应该 一个 | 更新日期: 2023-09-27 18:08:32
我的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);
是否有我应该使用的替代类型-或周围的工作?
通常的做法是:
// 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
—这基本上取决于您的对象和序列化格式。
。EF/code-first使用二进制将Edmx模型存储到__MigrationHistory
表中,它们使用相同的方法(只是低级)。
如果你每次只需要保存/加载不同的'基本类型'(比如一次是int,另一次是text等)
…那么你可能会有更多的选择(继承可能等等)-但我不会推荐太多。
相对于其他方法,我更喜欢第一种方法,因为这种数据可能无法用于关系,所以大多数时候如何存储它并不重要。
实体框架将。net类型映射到SQL类型。你不应该使用System.Object
作为EF不知道什么SQL类型映射到它。这并不理想,但是如果您确实需要在数据库中拥有一个包含任何对象的列,那么可以使用string ParameterValue
并在从数据库加载该列时转换该值。如果需要,您还可以添加一个新的字段string ParameterValueType
,您将保存值的类型,以帮助您将其转换回来。
我认为你可以使用Dictionary<string, string>
作为。net数据类型在你的领域模型中使用,并在保存/加载时以json格式对其进行反序列化,这是明文,你可以检查Sql Server中的内容,甚至改变它。
很高兴看到你继续前进:-)