在EntityFramework中将POCO对象转换为代理对象

4

我有一个MVC3项目,遇到了一个问题。我有一个Create控制器,它以我的POCO对象之一作为参数。我通过以下方式将此对象添加到数据库中:

  entity = dbSet.Add(entity);

在此方法返回后,我希望使用对象的延迟加载功能。不幸的是,该对象不是由EntityFramework生成的代理对象...有没有办法解决这个问题?
谢谢, AFrieze

在创建控制器时,您是否正在使用POCO代理?据我所知,您不能混用POCO和POCO代理,因为Entity Framework和POCO代理的要求之一是将ObjectContextOptions.ProxyCreationEnabled设置为true,这将在整个ObjectContext中启用代理。 这是一个不错的链接:http://msdn.microsoft.com/en-us/library/dd468057.aspx。 - Josh
啊哈,明白了。如果你将信息发送到BAL并修改BAL以使用ObjectContext.CreateObject(...),然后返回结果对象,只要满足所有代理规则,该对象应该是POCO代理。问题在于你正在使用entity = dbSet.Add(entity),这不会创建POCO代理对象。 - Josh
谢谢Josh。我的当前解决方案类似,我的存储库接受一个POCO对象,调用dbset.Generate(),然后将POCO对象中的所有字段映射到新的PROXY对象并切换引用。这似乎非常不优雅。有没有办法获取已附加的POCO对象并获得其PROXY表示形式? - AFrieze
很遗憾,据我所知,没有自动翻译的功能。你必须像现在这样手动翻译。 - Josh
谢谢提供这些信息,我仍然希望找到一种解决这个不太优雅的问题的方法...其他人肯定也遇到过这个问题,因为我知道存储库模式在Entity Framework中很受欢迎。 - AFrieze
显示剩余2条评论
1个回答

5
当你将实体传递给Add方法时,该实体必须已经是代理过的。 Add方法不会返回类的另一个实例,并且您不能将现有实例的类型更改为代理类型。
您的选择是:
  • 在控制器中不使用实体作为输入 - 使用某些视图模型并填充由dbSet.Create创建的新实体 - 这将创建一个空的代理分离实体。
  • 不要添加在控制器中接收到的实体,而是通过dbSet.Create创建一个新实体,并将接收到的数据复制到创建的实体中。
  • 不要使用默认的模型绑定程序。创建自定义模型绑定程序(即负责从HTTP请求中提取数据并填充传递给控制器的参数的代码),该程序将使用dbSet.Create而不是默认实体构造函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接