我该如何定义一个可以在EF中采用各种数据类型的字段?

时间:2013-04-10 13:53:24

标签: c# .net entity-framework ef-migrations

我的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);

我应该使用另一种类型 - 或者是一种解决方法吗?

3 个答案:

答案 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中甚至更改它。

很高兴看到你前进: - )