2013-04-10 37 views
2

我的poco課程如下;如何定義可以在EF中使用各種數據類型的字段?

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

爲什麼你認爲你需要一個字段,可以「採取各種數據類型」?你在實現[Inner-platform](http://en.wikipedia.org/wiki/Inner-platform_effect)反模式嗎? – 2013-04-18 19:58:48

回答

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(); } 
} 

...,並使用一些解析/格式化 - 某種形式的序列化(這取決於你所擁有的是文字,一滴,XML等更好的體現)。

你當然應該「緩存」如果貴等

此外,您可能會或可能不會需要存儲ParameterType沿着反序列化值 - 這取決於你的對象和序列化格式基本。

例如EF/code-first使用二進制將Edmx模型存儲到__MigrationHistory表中 - 並且它們使用相同的方法(僅適用於較低級別)。

如果你只需要保存/加載不同的「基本類型」每次(如一旦它的INT,另一次是文本等)

...那麼你可能有一些更多的選擇(繼承,也許等) - 但我沒有推薦太多。
我更喜歡第一種方法,因爲這種數據在關係方面可能無法使用,所以大多數時候如何存儲它並不重要。

1

實體框架將.Net類型映射到SQL類型。 您不應該使用System.Object,因爲EF不知道要將其映射到哪種SQL類型。 這並不理想,但如果您確實需要在數據庫中有任何對象的列,請使用string ParameterValue並在從數據庫加載時轉換該值。如果需要,您還可以添加一個新字段string ParameterValueType,您可以在其中保存值的類型以幫助您將其轉換回來。

0

我想你可以使用一個Dictionary<string, string>作爲你的域模型中使用的.NET數據類型,並且在保存/加載時以清晰文本的json格式對它進行de/serialize,並且你可以檢查Sql Server中的內容甚至改變它。

很高興見到你在移動:-)

相關問題