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 行开始映射片段时出现问题:没有为 Set ScheduledTasks 中的属性 ScheduledTask.callback 指定映射。在以下情况下,具有密钥 (PK) 的实体将不会往返:实体类型为 [Frontline.Core.Scheduling.ScheduledTask]

加载上下文时。

如何使用实体框架将对象与委托持久化?

4

2 回答 2

0

我看不出你的要求是如何工作的。委托是链接 2 个对象的运行时信息。接近这一点的唯一方法是完全序列化对象图并将其存储在某处。

有关更多信息,请参见此处;我们可以将代表保存在文件中吗(C#)

我认为你最好重新考虑你的设计 - 你可以将一个 ID 存储到订阅者的某个其他对象Callback,并在从数据库加载对象后重新连接这些对象。但是,如果订阅者实际上可以是您系统中的任何东西,那将使数据库设计复杂化。

于 2013-01-31T01:52:06.030 回答
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 回答