22

メタデータを保持したいクラスがあります。相互作用のシナリオがいくつかあるため、メタを使用すると、相互作用の種類ごとに異なるメタを保持できます。

class Feed()
{
    Guid FeedId { get; set; }
    ObjectMetaDictionary Meta { get; set; }
}

EF でこの ObjectMetaDictionary をシリアル化し、文字列/VarChar としてデータベースに格納してもらいたいと考えています。レコードを取得するときに、ObjectMetaDictionary として逆シリアル化する必要があります。

EF はこれをサポートしていますか? どうすればいいですか?

Entity Framework Code First を使用しています。

解決済み:私の問題を解決する以下の回答を提供しました。SOが許可するとすぐに、この回答を受け入れます。

4

3 に答える 3

24

どうやらこれは実際には非常に簡単です。この以前の SO answerからの助けのおかげで、私はそれを機能させることができました。

流暢な構成OnModelCreatingにより、DB にシリアル化して再度戻すための値プロパティとして何を使用するかを EF に伝えることができます。

これが私の解決策です:

public class Feed
{
    public virtual Guid FeedId { get; set; }

    public virtual FeedMetaData Meta { get; set; }

    public virtual string Title { get; set; }
    public virtual string Description { get; set; }

}

public class FeedMetaData
{
    public Dictionary<string, string> Data { get; set; }

    public string Serialized
    {
        get { return JsonConvert.SerializeObject(Data); }
        set
        {
            if(string.IsNullOrEmpty(value)) return;

            var metaData = JsonConvert.DeserializeObject<Dictionary<string, string>>(value);

            Data = metaData ?? new Dictionary<string, string>();
        }
    }

    // addl code removed...
}

public class FeedsDbContext : DbContext
{
    public DbSet<Feed> Feeds { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.ComplexType<FeedMetaData>()
                    .Property(p => p.Serialized)
                    .HasColumnName("Meta");
        modelBuilder.ComplexType<FeedMetaData>().Ignore(p => p.Data);

        base.OnModelCreating(modelBuilder);
    }
}
于 2013-02-09T06:21:25.127 に答える
1

Entity Framework オブジェクトをシンプルにし、データベース内の列に String プロパティを持たせます。

class Feed()
{
    Guid FeedId { get; set; }
    String Meta { get; set; }
}

プロパティをそのまま保存およびロードするメソッドを作成します(EFを使用してからしばらく経ちましたので、これらのゲッター/セッターで一時的なプロパティを作成できるかどうか、または何か他のものが必要かどうかはわかりません)

//Reading from string column Meta
(ObjectMetaDictionary) XamlServices.Load(new StringReader(someFeed.Meta));

//Saving to string column Meta
someFeed.Meta = XamlServices.Save(value);

ただし、これはプロジェクトに別の問題をもたらします。を変更するObjectMetaDictionaryと、データベースから正しく逆シリアル化されない可能性があります。これObjectMetaDictionaryは本質的にデータベース スキーマの一部となり、それに応じてバージョン管理または変更を処理する必要があります。

于 2013-02-08T19:30:13.667 に答える