我应该如何定义一个可以接受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);

是否有我应该使用的替代类型-或周围的工作?

我应该如何定义一个可以接受EF中各种数据类型的字段?

通常的做法是:

// 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中的内容,甚至改变它。

很高兴看到你继续前进:-)