【问题标题】:Map Delegate from Model to Entity将委托从模型映射到实体
【发布时间】:2015-04-04 07:02:47
【问题描述】:

假设我有以下模型:

class Foo
{
   public delegate void Bar();
   public Bar MyBar { get; set; }
}

我想将此映射到我的实体:

class FooEntity
{
   public delegate void Bar();
   public Bar MyBar { get; set; }
}

这是怎么做到的?我尝试过使用 Automapper:

void ConfigureMappings()
{
    // how else do I need to configure this?
    Mapper.CreateMap<Foo, FooEntity>();
    Mapper.CreateMap<Foo.Bar, FooEntity.Bar>(); // is this right?
}

让数据驱动这个委托对我来说很重要,因为我需要能够根据MyBar 的值在数百种不同的方法之间进行切换。有什么想法吗?

编辑:好的,因此在将委托移出每个类的范围后从模型映射到实体时不再引发异常:

public delegate void Bar(object obj);

public class Foo
{
   public Bar MyBar { get; set; }
}

public class FooEntity
{
   public Bar MyBar { get; set; }
}

现在我收到:错误 3004:从第 6 行开始映射片段时出现问题:没有为 Set Foos 中的属性 FooEntity.MyBar 指定映射。在以下情况下,具有密钥 (PK) 的实体将不会往返:实体类型为 [Project.MyDbContext.FooEntity]。

我的数据库上下文代码如下所示:

class MyDbContext : DbContext
{
    DbSet<FooEntity> Foos { get; set; }
}

我将它保存到数据库中:

public static class Test()
{
   var foo = new Foo { MyBar = MyFancyDelegate };
   using (var context = new MyDbContext())
   {
       context.Foos.Add(Mapper.Map<FooEntity>(foo));
       context.SaveChanges();
   }
}

public static void MyFancyDelegate(object obj)
{
   Console.Write("test");
}

我的问题只是我想做的事吗?不能将委托方法保存到 SQL 表中吗?

【问题讨论】:

  • 现在您无法在 SQL 表中保存 函数 (或委托) - 最坏的情况是,这意味着将您的所有程序(代码)和内存(状态)序列化为这个确切的时间点
  • 所以解决方案显然是考虑需要什么样的数据来重新创建Bar 并将其序列化到 SQL 表中;)
  • 问题是我需要代理潜在地做很多非常不同的事情。我试图避免有一个完全专门用于存储为此目的的静态方法的类,但如果我不能将它们存储在 SQL 中,我看不到解决办法。
  • 您将不得不找到一种方法,抱歉 - 正如我所说:您的代表可能会被各种关闭和东西绑定,老实说,我不知道您为什么要保存它跨度>
  • 如果您要对该问题投反对票,请说明您这样做的原因。

标签: c# entity-framework automapper


【解决方案1】:

您可以将您的委托替换为可以包含委托方法代码的字符串。 然后添加一个“仅获取属性”或使用 Roslyn 将字符串属性转换为 c# 方法的方法。

【讨论】:

  • 这是唯一一种可以按照我想要控制代码的方式工作的方法。我一直在序列化委托指针并将指针转换为要存储的字符串,但是如果方法或其签名发生更改,当我检索指针时会遇到问题。
【解决方案2】:

如 cmets 中所述,无法以我尝试的方式将委托存储在 SQL 中。

相反,有两种方法可以用来解决问题:

  • 序列化委托指针。然后可以将byte[] 对象转换为字符串并存储。检索到值后,可以将其转换回byte[] 对象(使用Convert.ToBase64StringConvert.FromBase64String 进行转换)。这种方法的优点是您不需要任何形式的动态编译代码;您只是在找到一个指向您已经可以访问的代码的指针。当然,缺点是如果您更改方法签名的任何内容,您的指针将会中断。

  • 将代码文本本身存储为字符串,然后使用 System.CodeDom 或其他一些编译库即时编译它。这种方法的优点是所见即所得;您可以查看存储中的代码,并能够在应用程序上下文之外对其进行操作。缺点:如果您的代码在其自己的范围内无法引用外部对象,并且您在知道代码将实际正常运行时失去任何安全性(因为它现在在您的源代码控制之外存储和访问)。

【讨论】:

    猜你喜欢
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多