Entity framework 实体框架代码在复合应用程序中的第一个TpT映射

Entity framework 实体框架代码在复合应用程序中的第一个TpT映射,entity-framework,entity-framework-4.1,mapping,code-first,composite-application,Entity Framework,Entity Framework 4.1,Mapping,Code First,Composite Application,我正在开发一个复合的total system应用程序,不同的公司可能会添加不同的模块,但只有一个数据库。我的框架中有一个通用存储库,它独立于技术(我的意思是它的提供者基础,目前的defult提供者是EF 4.1).I已分离包含poco实体的公共层,每个模块在其自己的程序集中也有不同的实体。 现在的问题是实体映射。我无法从我的EF提供者项目访问我的实体,因为我不知道未来的模块!那么,如何以通用方法映射实体呢?可能吗 我认为有一种解决方案是,创建一个配置文件并添加实体FullName,然后对每个实体

我正在开发一个复合的total system应用程序,不同的公司可能会添加不同的模块,但只有一个数据库。我的框架中有一个通用存储库,它独立于技术(我的意思是它的提供者基础,目前的defult提供者是EF 4.1).I已分离包含poco实体的公共层,每个模块在其自己的程序集中也有不同的实体。 现在的问题是实体映射。我无法从我的EF提供者项目访问我的实体,因为我不知道未来的模块!那么,如何以通用方法映射实体呢?可能吗

我认为有一种解决方案是,创建一个配置文件并添加实体FullName,然后对每个实体进行操作和反映,然后我可以将它们添加到OnModelCreat(…)方法中,但当然存在一些性能问题

编辑: 首先感谢你的回复,拉迪斯拉夫。 但是还有更多的信息给你


您可以要求每个模块必须包含映射 它使用的每个新实体的类。当您启动应用程序时 您将只使用反射来获取从中派生的所有类 StructuralTypeConfiguration(包括实体和复杂 类型),创建这些类型的实例并将其添加到配置中 DbModelBuilder中的集合(可以在OnModelCreating中完成)

这将需要一些时间,但只有在上下文不确定时才会发生一次 第一次使用。您可以在运行期间触发此创建 应用程序启动-应用程序只需要一些时间来启动和启动 配置他们需要使用的所有基础设施

编辑:

我必须在每个模块中引用EntityFramework.dll,这在本例中不适用

对。您希望允许其他开发人员定义自己的实体 它将由您的核心应用程序持久化。在这种情况下,他们 必须使用您选择的持久性框架来告诉您的应用程序 如何保持他们的实体

==>正如我前面提到的,EF不是我唯一的数据提供者!我必须有一些其他的DP,比如DB4O的数据提供者等等,所以我不想引用每个提供者对每个模块的依赖关系。。。因此,我需要将EF封装在一个单独的组件中

如果使用存储库,每个模块甚至应该包含自己的存储库 用于处理自身实体的存储库-通用存储库 不存在。通用存储库是一个冗余的无用层 这只会让你选择的ORM工作更加困难。说清楚 -存储库模式的正确实现不是通用的。它是特定的,它公开了单个实体或应用程序的数据访问功能 聚合根

==>我可以要求任何可靠的参考吗?!如果只有一个存储库可以满足我的所有需求,为什么要为每个模块添加一个存储库?哪个是多余的? 在我的机会中,使用特定或通用rep在正确的情况下都是正确的。我的90%的模块从存储库中具有相同的需求,并且所有模块都应该具有CRUD…

如果您不想在模块中使用EF依赖项,也不要使用EF 或者定义您自己的中间映射层,该层将被转换 到应用程序中的特定映射-使用zero进行大量工作 增值

==>事实上,我正试图定义我自己的映射层,因为我需要它在我的应用程序架构中。它对我来说不是无用的。这是我问如何实现它的唯一原因。我正在寻找最佳解决方案,希望你能帮我完成:)

另一个选择就是不允许您的模块使用新的实体 因为它看起来更像你现在的期望。中频模块 开发人员必须为其实体定义新的数据库表 还能够使用持久性并定义之间的映射 表和他的实体

==>好主意,但不适合我的情况;)

我必须在启动时反映每个模块的dll,这意味着大量沉重的dll的反映和。。。还有其他想法吗

你见过像Photoshop、VisualStudio甚至其他应用程序吗 MS Office应用程序在启动期间?你认为是什么 当你看到闪屏时会发生什么?应用程序正在初始化-正在初始化 正在加载和初始化其功能和插件。偶数服务器 应用程序可能需要几分钟才能完全启动。你正在建造 模块化应用程序(非复合),所以您必须为此付费 要求

是的,我想我看到了一些!例如,如果他们在启动时装载所有托盘或边栏,他们必须雇用我。嘿,亲爱的microsoft,如果你不知道延迟装载是什么,我可以帮助你提高性能:)

如果你自己不想使用反射,你可以使用MEF 构建模块化的基础设施

==>我已经在使用Prism和MEF来处理模块化,但只用于模块,不用于我的提供商…

听起来EF不是企业复合应用的好解决方案,对吗

你没有提出任何不应该的企业要求 由EF完成。你只是在与你的期望抗争 模块开发人员使用新的实体,但不允许他们 描述这些实体将如何持久化,但谁来描述 是吗

==>一个模型或一个中间映射器层,它将在每个模块中工作加载并映射实体,如果EF支持(据我所知,它不能)我需要一些类似于引导程序的东西来映射实体:)

您不是在构建复合应用程序。复合应用 获取现有功能(组件、现有应用程序),其中 单独工作,并将它们组合到新的应用程序中。你是 构建模块化应用程序,使您的核心能够承载