C# DAL:数据上下文原则理解

C# DAL:数据上下文原则理解,c#,architecture,orm,data-access-layer,C#,Architecture,Orm,Data Access Layer,不确定是否有“官方”名称,但我所说的DataContext是指透明地维护对象状态的对象,它提供更改跟踪、工作状态功能、并发性以及其他许多有用的特性。(在实体框架中是ObjectContext,在NHibernate-ISession中) 最后,我想到应该在我的应用程序中实现类似的东西(它使用mongodb作为后端,当我们能够跟踪某个属性更改时,mongodb的部分更新就可以了) 实际上,我有几个关于这个问题的问题 任何人都可以制定对DataContext的需求吗?-您对it的任务和责任有何理解?

不确定是否有“官方”名称,但我所说的DataContext是指透明地维护对象状态的对象,它提供更改跟踪、工作状态功能、并发性以及其他许多有用的特性。(在实体框架中是ObjectContext,在NHibernate-ISession中)

最后,我想到应该在我的应用程序中实现类似的东西(它使用mongodb作为后端,当我们能够跟踪某个属性更改时,mongodb的部分更新就可以了)

实际上,我有几个关于这个问题的问题

  • 任何人都可以制定对DataContext的需求吗?-您对it的任务和责任有何理解?(我找到的最相关的是埃斯波西托的书,但不幸的是,这是在msdn样本水平上)

  • 您对变更跟踪实施有何建议?(以最简单的方式,可以“手动”跟踪实体中的更改,但需要编码并将dal与业务逻辑混合,所以我最感兴趣的是“自动”方式,使实体更加poco化)

  • 有没有办法利用现有的解决方案?(我希望nhibernate基础设施能够允许在后台插入自定义模块与mongo一起工作,但不确定它是否允许与非sql数据库一起工作)


  • 问题2的答案:要使POCO类工作,您需要在运行时生成代码,可能需要使用System.Reflection

    如果您分析EntityFramework,您将看到它需要虚拟属性来进行更改跟踪。。。这是因为它需要在运行时创建一个生成的类,该类重写每个属性,然后添加代码,在有人更改该属性时通知DataContext

    EntityFramework还生成初始化集合的代码,这样当有人尝试执行诸如添加和删除之类的操作时,集合对象本身就知道该做什么。

    DataContext(ObjectContext或EF中的DbContext)就是/模式的实现

    我建议您阅读Fowler的书,他在书中概述了几种持久性模式的实现。这可能有助于实现您自己的解决方案

  • DataContext基本上需要完成UoW的作业。它需要处理给定生命周期(即HTTP请求)中涉及的对象的读取和管理,即s.t。内存中没有两个对象表示数据库中的相同记录。此外,它还需要提供一些更改跟踪,以便对数据库执行部分更新(正如您已经提到的)

  • 关于变更跟踪,我完全同意变更事件等污染性房地产是不好的。EF4.1中引入的最新模板之一使用代理来处理该问题,并提供了使用普通POCO的可能性


  • 获取Fowler的“企业应用程序架构模式”的副本。它详细介绍了存储库、工作单元和其他相关模式。对,我知道模式的详细信息,主要是如何在“数据上下文”范围内统一所有这些抽象。EF4.1中介绍了使用代理来处理这一点,有可能在EF环境之外使用这些代理吗?不幸的是,我不知道。这些代理完全是在幕后动态创建的。试着在Google上搜索“EntityFramework4.1POCO代理”或类似的东西。顺便说一句,从你对内存中对象的描述来看,我想应该还有一个身份映射。我还担心的是,我已经实现了几个存储库(每个实体)。您的建议是什么?让DataContext成为他们的门面,或者将存储库概括为一个类?当然,身份映射可能也是一个问题。尝试查看工作单元模式。我强烈向你推荐我推荐的那本书。它很好地概括了所有这些持久性和体系结构问题。好的,所以我能够生成一个派生类型,它覆盖虚拟属性并跟踪更改。我对收藏不太清楚。也许,若属性/字段被声明为ICollection,那个么它是可能的——只是用我的ICollection实现替换字段。但如果它被宣布为列表?你怎么看?如果它是一个列表,那么你必须在使用DataContext保存更改时找出添加或删除了哪些元素,因为你必须将原始元素列表与更改的列表进行比较,并确定要更新、插入或删除元素的元素。好吧。。这很简单,为什么我以前没想过呢?(谢谢)