2

私のポコクラスは次のとおりです。

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

通常行われることは、例えば

// 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の場合、テキストの場合など)

...さらにいくつかのオプション(継承など)があるかもしれませんが、あまりお勧めするものはありません。
この種のデータは関係の観点から使用できない可能性が高いため、最初のアプローチを他のアプローチよりも好みます。そのため、ほとんどの場合、データをどのように保存するかは問題ではありません。

于 2013-04-10T18:29:00.677 に答える
1

Entity Framework は .Net 型を SQL 型にマップします。System.ObjectEFはそれをマップするSQLタイプを知らないため、使用しないでください。理想的ではありませんが、データベースにオブジェクトを含む列が本当に必要な場合はstring ParameterValue、データベースからロードするときに値を使用して変換します。必要に応じてstring ParameterValueType、値のタイプを保存して元に戻すのに役立つ新しいフィールドを追加することもできます。

于 2013-04-10T14:08:31.943 に答える
0

ドメイン モデルで使用する .NET データ型としてaDictionary<string, string>を使用し、クリア テキストである json 形式で保存/読み込み時に逆シリアル化し、Sql Server の内容を検査して変更することもできると思います。

あなたが先に進んでいるのを見てうれしい:-)

于 2013-04-18T18:53:01.803 に答える