2010-01-31 75 views
4

我的问题对于高级用户来说可能有点不同或基本。需要生成EDMX文件并编译它们

我有一个可由管理员定制的Web应用程序。这意味着,管理员可以添加新的表架构或编辑表列,添加新的表列等。这些更改映射到我们的逻辑对象(非常类似于EDMX),该对象在更改后发布。在发布的同时,我们生成了需要进行必要更改的存储过程。

从UI我们使用这些逻辑对象DB(使用COM其中理解的映射,并执行适当的存储过程和视图等)来连接。现在我正在考虑使用EF来替换目前我们正在使用的逻辑对象模型。我可以动态创建EDMX文件(csdl,msl,ssdl,cs文件),但我不确定如何编译它们并将这些类动态封装到DLL中。这意味着,当我单击按钮时,将创建所有edmx相关文件,并且必须基于CS文件创建DLL,并且网站必须能够访问代码中的新更改。

你能帮助我如何自动和动态编译CS文件。我不会在客户端拥有其他文件(如default.aspx等)的源代码。

感谢 阿尔伯特

回答

2

Bepenfriends - 而不是从外壳在尝试CSC,可以考虑使用CSharpCodeProvider.CompileAssemblyFromFile。

有一点要小心:如果你编译代码,然后尝试重新编译它,你可以在已创建的组件锁定起来。为此,我创建了一个AsyncCompiler,它创建一个新的AppDomain,在那里编译,然后卸载AppDomain。

这是一些晦涩的代码,但我这样做(生成AEF XML文件,从他们生成的代码,然后编译到一切的结合体),而且运作良好。我唯一没有完全正确的是动态导入存储过程 - 我的SSDL具有它们,但不包含CSDL或MSL。在这里寻找解决方案。

我希望这里的关键词足以让你走向正确的方向。

+0

感谢TonyG,是否有可能提供asynccompiler的代码片段(可能是框架)。是的,你的关键词将我带到很多地方。 – Bepenfriends 2011-01-24 05:55:34

+0

你能概述你在编译器中做了什么吗?我发现自己处于类似的情况。我试图从edmx本身提取.csdl,.msl内容并将它们嵌入到程序集中。 – 2014-09-23 11:23:44

+0

不幸的是,我在四年前做过这件事,并且在一段时间内没有重新访问过它。所以我的记忆在这个时候对你来说毫无用处,所以很抱歉。但是这是一些非常酷的代码,我可能会在后面挖掘。如果你正在参与一个公​​司项目,那么也许我可以把时间放在这个(PM me)上,否则我不能优先考虑任何更多的努力。存储过程中的问题是,它在我使用的EF版本中不受支持,但它现在应该是。希望我能在这里帮助更多。 – TonyG 2014-09-23 15:59:14

0

我真的没有给你一个明确的答案,只是还没有 - 但有两个潜在的解决方案,你可以看看,有可能在不久的将来:

1)有一组CodeSmith模板名为PLINQO,它可以从您的数据库生成您的Linq-to-SQL模型(DBMX)及其关联的* .cs文件。我问他们关于实体框架支持我自己,他们证实正在开发 - 所以也许他们会很快有一段时间。

这是因为它们的代码和模型生成模板,你绝对可以采取那些LINQ到SQL和调整他们EDMX了。一点工作,但绝对有可能。一旦获得* .cs文件和* .edmx模型,就可以使用安装在每台安装了.NET的计算机上的CSC(C#)命令行编译器来生成一个生成的程序集。 2)使用.NET 4,新的实体框架4将包括T4 templates(另一种代码生成技术),它将允许您自定义您的代码生成。这里同样适用 - 您可以从外部生成EDMX模型和关联的* .cs文件,并从这些模板中随时生成程序集。

关于该主题,另请参阅blog post,并且在gooling(或binging)或“EF4 T4模板”中应该找到大量信息。

希望至少有一点帮助!

+0

嗨,我能够分别为我的数据库创建EDMX类和CSDL文件。这样做没有问题。我的问题是,每当我改变EDMX(从我的自定义框架),我需要将这些类编译为DLL(假设我具有相同的文件夹权限)。从网页按钮点击。 我在这个地方(编译)没有在类的生成。我不知道如何从网站调用CSC(在服务器)。 – Bepenfriends 2010-02-02 16:30:26

相关问题