0

デリゲートプロパティを使用してオブジェクトを永続化しようとしています

public delegate void Callback(ScheduledTask ScheduledEvent);
public class ScheduledTask
    {
        [Key]
        public int Id { get; set; }

        /// <summary>
        /// Time the event will be triggered
        /// </summary>
        public DateTime ScheduledTime { get; set;} 


        /// <summary>
        /// Delegate to call back
        /// </summary>
        public Callback callback { get; set; }

        /// <summary>
        /// Any event metadata
        /// </summary>
        public Dictionary<String, object> Metadata { get; set; }
    }

しかし、私はこのエラーを受け取ります:

(12,10):エラー3004:6、12、21行目から始まるフラグメントのマッピングの問題:SetScheduledTasksのプロパティScheduledTask.callbackにマッピングが指定されていません。キー(PK)を持つエンティティは、次の場合にラウンドトリップしません。エンティティがタイプ[Frontline.Core.Scheduling.ScheduledTask]の場合

コンテキストをロードするとき。

エンティティフレームワークを使用して、デリゲートでオブジェクトを永続化するにはどうすればよいですか?

4

2 に答える 2

0

私はそれをバイナリストリームにシリアル化し、それを保存しました。ちょっとグロスですが、うまくいきます。

    public byte[] callbackData { get; set; }

    /// <summary>
    /// Delegate to call back
    /// </summary>
    [NotMapped]
    public Callback callback
    {
        get
        {
            if (_callback == null && callbackData != null && callbackData.Count() > 0)
            {
                BinaryFormatter formatter = new BinaryFormatter();
                using (var stream = new MemoryStream(callbackData))
                {
                    _callback = formatter.Deserialize(stream) as Callback;
                }
            }
            return _callback;
        }
        set
        {
            _callback = value;
            if (value == null)
            {
                callbackData = null;
            }
            else
            {
                BinaryFormatter formatter = new BinaryFormatter();
                using (var stream = new MemoryStream())
                {
                    formatter.Serialize(stream, value);
                    callbackData = stream.ToArray();
                }
            }
        }
    }
于 2013-01-31T05:48:18.873 に答える
0

あなたが求めているものがどのように機能するかわかりません。デリゲートは、2 つのオブジェクトをリンクするランタイム情報です。これに近づく唯一の方法は、オブジェクト グラフを完全にシリアル化し、それをどこかに保存することです。

詳細については、こちらを参照してください。デリゲートをファイルに保存できますか (C#)

のサブスクライバーである他のオブジェクトに ID を保存しCallback、データベースからオブジェクトをロードした後にオブジェクトを再接続することができます。ただし、サブスクライバーが実質的にシステム内の任意のものである可能性がある場合、データベースの設計が複雑になります。

于 2013-01-31T01:52:06.030 に答える