2

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

是否有我应该使用的替代类型 - 或解决方法?

4

3 回答 3

1

Entity Framework 将 .Net 类型映射到 SQL 类型。您不应该使用System.Object,因为 EF 不知道将其映射到什么 SQL 类型。这并不理想,但如果您确实需要在数据库中拥有包含任何对象的列,请在string ParameterValue从数据库加载该值时使用并转换该值。如果需要,您还可以添加一个新字段string ParameterValueType,在其中保存值的类型以帮助您将其转换回来。

于 2013-04-10T14:08:31.943 回答
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旁边 - 这基本上取决于您的对象和序列化格式。

例如,EF/code-first 使用二进制将 Edmx 模型存储到__MigrationHistory表中——并且它们使用相同的方法(只是较低级别)。

如果您每次只需要保存/加载不同的“原始类型”(比如一次是 int,另一次是文本等)

...then you may have some more options (inheritance maybe etc.) - but nothing I'd recommend much.
I prefer the first approach over any other as that kind of data is likely not usable in terms of relationships, so it doesn't matter how you store it most of the time.

于 2013-04-10T18:29:00.677 回答
0

I think you can use a Dictionary<string, string> as the .NET data type to use in your domain model and de/serialize it on save/load time in json format which is clear text, and you can inspect the contents in Sql Server and even change it.

Glad to see you moving on :-)

于 2013-04-18T18:53:01.803 回答