EF 4.1 DbContext Generattor - 将实体放在不同的项目中?

Posted

技术标签:

【中文标题】EF 4.1 DbContext Generattor - 将实体放在不同的项目中?【英文标题】:EF 4.1 DbContext Generattor - Put Entities in different project? 【发布时间】:2011-06-14 19:58:05 【问题描述】:

作为我们应用程序架构的一部分,我们喜欢在功能层之间定义清晰的界限。因此,一个典型的应用解决方案将包含:

实体 型号 任务 演讲者 前端

这些最终成为完全不同的程序集。

Entity/Model 的描述是为了将数据库访问功能与我们的 POCO 保持在一个单独的层中,这样只有 Task 需要了解 Model,而 Presenter 之前的每个人都知道 Entity

这在使用 Code-First 或 Fluent-API 时效果很好 - 但由于在这些范例中缺乏对 SPROC 的支持,事实证明在 EF 4.1 下我必须使用 EDMX 模型。

所以 - 我正在使用 DbContext 生成器生成 POCO,但生成的类最终位于 .Model 下,虽然我可以将它们的命名空间强制转换为 .Entity,但它们仍然存在于 .Model 程序集中,这意味着 now 。 Presenter 必须引用 .Model 才能访问应该在 .Entity 中的类。

有没有办法强制或欺骗 EF 将其生成的输出转储到不同的项目中?

【问题讨论】:

【参考方案1】:

当然。 DbContext Generator 只是两个 T4 模板。您可以将模板生成实体移动到其他项目。您只需要修改模板以指向正确的 EDMX 文件。这是默认设置:

string inputFile = @"Model.edmx";

您必须将其更改为 EDMX 文件的相对地址。它会是这样的:

string inputFile = @"../Model/Model.edmx"

模板将自动为生成的实体使用当前项目的默认命名空间,但您必须修改第二个模板的上下文以使用新的命名空间,以便从引用的程序集中正确解析实体类型。

在另一个项目中使用模板有一个小缺点 - 当您修改模型时它不会自动更新。您必须始终使用模板文件上下文菜单中的 Run custom tool 手动触发实体重新创建。

【讨论】:

你知道,EF 已经够复杂了,这个特别的答案如此简单的事实就像是在原本非常令人沮丧的几天里的一缕阳光。谢谢! 太棒了 - 我将 Model.tt 移至 .Entity,在那里进行了一次编辑,编辑了 Model.Context.tt 并在 using 块中添加了实体命名空间,非常完美!

以上是关于EF 4.1 DbContext Generattor - 将实体放在不同的项目中?的主要内容,如果未能解决你的问题,请参考以下文章

播种 EF 4.1 时代理的第一个导航属性为空

如何使用 Code-First EF 4.1 从数据库中删除多个项目

EF——DbContext

我是不是需要手动关闭 EF 核心 Dbcontext 连接

如何从 EF7 DbContext 获取 ConnectionString

EF DbContext 和 ObjectContext 转换