我正在做一些重构,并尝试重用我生成的实体模型。我的应用程序有一些程序集,其中一个是我的外向公共类型 (API),另一个包含提供程序的实现(例如日志)。
我想拆分实体和模型的生成,以便实体位于 API 程序集中,容器位于实现程序集中。这可能吗?
有可能。我就是这样做的。
- Assembly A
- Assembly B
- 数据库.EDMX (添加为链接 http://msdn.microsoft.com/en-us/library/9f4t9t92(VS.80).aspx到程序集 A 中的真实文件)
- 实体容器.TT
- 实体容器.cs
这就是一切的安排。这些是粗略的步骤:
- 右键单击 A 中的 EDMX(公共 API 程序集)并添加代码生成文件
- 将 TT 添加到项目中。将其称为模型,因为它仅包含模型。
- 编辑了 TT 并删除了实体容器的代码生成
- 在程序集 B(内部实现)中添加 Database.EDMA 作为链接
- 在程序集B中打开,右键单击并添加代码生成文件
- 将 TT 添加到项目 B。将其称为 EntityContainer,因为它将仅包含该 TT。
- Edited TT to do the following
- 删除了实体创建步骤
- 将 Database.EDMX 的路径更改为指向 A 中原始副本的相对路径
- Added a
using
对于我的模型
希望这一切都能正确编译和工作(我距离编译和测试所有内容还很远)。到目前为止看起来不错。
附加变更:
在我的实体容器 TT 中,我必须将 EscapeEndTypeName 的定义修改为以下内容:
string EscapeEndTypeName(AssociationType association, int index,
CodeGenerationTools code)
{
EntityType entity = association.AssociationEndMembers[index]
.GetEntityType();
return code.CreateFullName(
code.EscapeNamespace(association.NamespaceName), code.Escape(entity));
}
我在用着association.NamespaceName
因为它包含来自其他程序集的正确命名空间。
我不知道答案,但我认为你的问题本质上相当于“是否有可能导致一个项目中的 T4 模板将代码发送到另一个项目中?”如果你能做到这一点,那么你就可以做你想做的事。但请注意,这在 EF 4 中要容易得多 http://blogs.msdn.com/efdesign/archive/2009/01/22/customizing-entity-classes-with-t4.aspx.
因此,我认为如果您直接提出这个问题,您可能会得到有用的反馈。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)