【问题标题】:Convert POCO object to Proxy object in EntityFramework将 POCO 对象转换为 EntityFramework 中的代理对象
【发布时间】:2011-12-31 17:33:48
【问题描述】:

我有一个 MVC3 项目,但遇到了问题。我有一个 Create 控制器,它将我的 POCO 对象之一作为参数。我像这样将此对象添加到数据库中:

  entity = dbSet.Add(entity);

此方法返回后,我想使用对象的延迟加载功能。不幸的是,该对象不是 EntityFramework 生成的代理对象......有没有办法以某种方式解决这个问题?

谢谢你, 弗里兹

【问题讨论】:

  • 您在使用创建控制器时是否使用 POCO 代理?据我所知,您不能混合使用 POCO 和 POCO 代理,因为实体框架和 POCO 代理的要求之一是将 ObjectContextOptions.ProxyCreationEnabled 设置为 true,这可以在整个 ObjectContext 中启用代理。这是一个很好的链接:msdn.microsoft.com/en-us/library/dd468057.aspx.
  • MVC3 项目完全不知道实体框架,它引用了模型项目(POCO 对象)和 BAL(存储库访问)。只要我使用从数据库中查询的对象,延迟加载在项目的各个级别都非常有效。基本问题是我可以在 MVC3 项目中创建一个对象并将其传递给我的 BAL,该 BAL 将其保存并将其适当地附加到上下文中……但我留下了对 POCO 对象而不是代理对象的引用可以利用延迟加载。
  • 啊,明白了。如果您向 BAL 发送信息并修改 BAL 以使用 ObjectContext.CreateObject(...),然后返回结果对象,只要满足所有代理规则,该对象就应该是 POCO 代理。问题是您使用的 entity = dbSet.Add(entity) 不会创建 POCO 代理对象。
  • 谢谢乔希。我当前的解决方案类似,我的存储库采用 POCO 对象,调用 dbset.Generate(),然后将我的 POCO 对象中的所有字段映射到新的 PROXY 对象并切换引用。这看起来很不雅。有没有办法获取一个附加的 POCO 对象并获取它的代理表示?
  • 不幸的是,据我所知,不是自动魔术。您必须边做边翻译。

标签: asp.net-mvc-3 entity-framework proxy poco


【解决方案1】:

当您将实体传递给Add 方法时,该实体必须已被代理。 Add 方法不会返回该类的另一个实例,并且您不能将现有实例的类型更改为代理类型。

您的选择是:

  • 不在控制器中使用实体作为输入 - 使用一些视图模型并填充由 dbSet.Create 创建的新实体 - 这将创建空的代理分离实体。
  • 不要添加控制器接收到的实体,而是通过dbSet.Create 创建一个新实体并将数据从接收到的实体复制到创建的实体
  • 不要使用默认模型绑定器。创建自定义模型绑定器(即负责从 HTTP 请求中提取数据并填充传递给控制器​​的参数的代码),它将使用 dbSet.Create 而不是默认的实体构造函数。

【讨论】:

    猜你喜欢
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2011-04-01
    • 1970-01-01
    • 2011-02-17
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多