使用委托属性保留对象

时间:2013-01-31 01:12:44

标签: c# asp.net asp.net-mvc entity-framework entity-framework-6

我试图用委托属性

来持久化对象
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]

加载上下文时

如何使用实体框架使用委托来保持对象?

2 个答案:

答案 0 :(得分:0)

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

点击此处获取更多信息; Could we save delegates in a file (C#)

我认为您最好重新考虑您的设计 - 您可以将ID存储到Callback订阅者的其他对象,并在从数据库加载对象后重新连接这些对象。但是,如果订户可以有效地成为系统中的任何内容,那将使数据库设计复杂化。

答案 1 :(得分: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();
                }
            }
        }
    }