Entity framework POCO vs POCO Proxy vs STE-哪一种最符合我们现在的做事方式?

Entity framework POCO vs POCO Proxy vs STE-哪一种最符合我们现在的做事方式?,entity-framework,Entity Framework,作为代码现代化计划的一部分,我试图找到一种使用实体框架来增强(并最终取代)我们自己开发的ORM的方法。ORM本身比之前的直接SQL调用有了很大的进步,但是现在基础设施的其余部分已经被拉上来了,我想开始逐步淘汰它 为此,我试图弄清楚如何通过实体框架构建类,使它们的行为与当前的ORM类似。理想情况下,在重新设计类时不需要任何代码更改,我们将获得延迟加载和轻松生成/更新类以匹配数据库等特性 当前的ORM实际上是构建SQL语句的一个非常奇特的包装器零件p=新零件(12345)将从partID=12345

作为代码现代化计划的一部分,我试图找到一种使用实体框架来增强(并最终取代)我们自己开发的ORM的方法。ORM本身比之前的直接SQL调用有了很大的进步,但是现在基础设施的其余部分已经被拉上来了,我想开始逐步淘汰它

为此,我试图弄清楚如何通过实体框架构建类,使它们的行为与当前的ORM类似。理想情况下,在重新设计类时不需要任何代码更改,我们将获得延迟加载和轻松生成/更新类以匹配数据库等特性

当前的ORM实际上是构建SQL语句的一个非常奇特的包装器<代码>零件p=新零件(12345)将从partID=12345的部分执行
select*,然后获取返回的数据行,并使用反射填充对象上的字段。当它保存时,它会做几乎相同的事情——它获取所有字段并使用这些字段更新数据行,然后将数据行写回数据库。通常,当我们希望编辑行时,它还会锁定数据库中的行。有点笨拙,但它是有效的

我试图找到一种方法,使用实体框架和模板,以一种不需要持久数据上下文的方式自动生成类。当前的方法允许我们在任何需要的地方创建对象,根据需要传递它们,并且知道当它们更新时,数据库将更新以匹配该对象。我已经看了很多东西(根据标题),但是我不知道我们可以使用哪种方法,所以上下文在对象库之外是不必要的

有人能给我指出正确的方向吗


编辑:我可能要求太多,或者想把一个方形的钉子塞进一个圆孔里。让我把我要找的东西简化一下,把它剥离到最低限度

有没有什么方法可以构造它,这样我就可以使用(var context=new context()){}
之外拥有一个有效的CRUD类型对象,这样我就可以将它传递给不相关的代码?我不在乎是否需要将它放回上下文来加载/保存它,只要它在它之外工作


如果使用EF无法做到这一点,那么这种情况下正确的设计模式是什么:一个表单打开另一个表单并传递发票。第二个表单接受该发票,逐步向用户输入该发票的付款,并生成一个新的付款对象。第一个表单接受该支付对象,并基于它对发票进行进一步处理。然后,所有内容立即提交到数据库。

POCO、带代理的POCO或STE都不符合您的体系结构。所有这些实体类型的要点是让您的实体实现持久化,而让您的实体实现持久化。最接近模型的是旧数据集


环境足迹的中心点是语境。如果您想保留您的体系结构,那么每个实体都必须处理自己的上下文。这就是反模式。EF希望您拥有上下文并使用上下文来获取和持久化实体-大多数EF功能都依赖于此模式

如果您确实希望使用EF进行延迟加载,那么您肯定需要创建EF-DbContext/Object-Context。我想,通过删除与持久性逻辑等无关的代码,将当前类转换为POCO类并不是什么大问题。我鼓励您通过处理EF上下文的服务层抽象持久化层,例如,表单调用服务层,服务层创建上下文实例和持久化/检索数据。

如果您使用POCO并关闭上下文的代理生成(或者如果您在处理上下文之前分离了它们),那么您的实体将在using context子句之外有效


如果对象的集合属性需要在using context子句之外有效,则在离开using context子句之前,需要在查询中使用include或填充其他查询。

因此每个类都有一个构造函数,该构造函数使用某种依赖项注入容器来接收ORM检索服务ice,这样像
Part p=new Part(12345);
这样的构造函数就可以工作了?你的对象是如何填充/更新它们的集合的?@DannyVarod,没有那么复杂。基类有一个函数,它基于所有用
[IsKey]标记的字段,从partID=12345的部分构建
select*语句
attribute-它从属性中获取列名和该字段的当前值。构造函数在调用该函数之前设置该值。因此,它变成:从构造函数参数中设置关键字段,将关键字段转换为SQL,将SQL转换为数据行,通过从数据行中提取每个字段并设置i来填充对象t的值。@GertArnold,请参阅人口的最后一条注释。更新只需将其翻转过来-它将获得数据行(新鲜),更新所有值以匹配当前值,然后保存该数据行。数据库中有一个库,用于处理SQL语句与数据行之间的转换,以及数据行与数据行之间的转换。@Bobson您仍然没有解释它如何知道哪个数据源(连接)用于获取其值。无论如何,这里似乎有一个真正的意大利面代码问题-您的模型的类不仅具有持久性意识-它们就像两个用超级胶水粘在一起的项目一样持久性耦合。我编辑这个问题是为了更多地反映真正的最终目标是什么,而不是如何处理。这会改变什么吗基本工作流是否与EF完全不兼容?我可以稍后将它们重新附加到上下文,以便将其提交到数据库?是的。您也可以复制p