我试图用委托属性
来持久化对象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]
。
如何使用实体框架使用委托来保持对象?
答案 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();
}
}
}
}