【问题标题】:Need to generate EDMX files and compile them需要生成EDMX文件并编译
【发布时间】:2010-01-31 19:18:41
【问题描述】:

对于这里的高级用户,我的问题可能有点不同或基本。

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

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

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

谢谢 阿尔伯特

【问题讨论】:

    标签: c# dynamic code-generation compilation edmx


    【解决方案1】:

    Bepenfriends - 考虑使用 CSharpCodeProvider.CompileAssemblyFromFile,而不是从 shell 尝试 CSC。

    需要注意的一点是:如果您编译代码然后尝试再次编译它,您可能会锁定已创建的程序集。为此,我创建了一个 AsyncCompiler,它创建一个新的 AppDomain,在那里编译,然后卸载 AppDomain。

    这是一些非常复杂的代码,但我正在这样做(生成 AEF XML 文件,从中生成代码,然后将所有内容编译到程序集中)并且效果很好。我唯一不太正确的是动态导入存储过程——我的 SSDL 有它们,但没有 CSDL 或 MSL。寻找解决方案将我带到了这里。

    我希望这里的关键词足以让你朝着正确的方向前进。

    【讨论】:

    • 感谢 TonyG,能否提供异步编译器的代码 sn-p(可能是骨架)。是的,您的关键字将我带到了很多地方。
    • 您能概括一下您在编译器中所做的工作吗?我发现自己处于类似的情况。我正在尝试从 edmx 本身中提取 .csdl、.msl 内容并将它们嵌入到程序集中。
    • 不幸的是,我四年前就这样做了,并且有一段时间没有重新访问它。所以我的记忆此时对你来说毫无用处,很抱歉。但这是一些非常酷的代码,我以后可能会挖掘出来。如果您正在从事公司项目,那么也许我可以为此花一些时间(PM我),否则我无法优先考虑更多的努力。存储过程的问题在于,我使用的 EF 版本根本不支持它,但现在应该支持。希望我能在这里提供更多帮助。
    【解决方案2】:

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

    1) 有一组名为 PLINQO 的 CodeSmith 模板可从您的数据库生成您的 Linq-to-SQL 模型 (DBMX) 及其关联的 *.cs 文件。我亲自向他们询问了有关实体框架的支持,他们确认正在研究它——所以也许他们很快就会有。

    由于这些是代码和模型生成模板,您绝对可以将它们用于 Linq-to-SQL,并针对 EDMX 进行调整。有点工作,但绝对有可能。获得 *.cs 文件和 *.edmx 模型后,您可以使用安装在每台安装了 .NET 的计算机上的 CSC (C#) 命令行编译器从中生成生成的程序集。

    2) 使用 .NET 4,新的 Entity Framework 4 将包含T4 templates(另一种代码生成技术),它允许您自定义代码生成。同样的故事也适用于这里 - 您可以在外部为类生成 EDMX 模型和关联的 *.cs 文件,并从这些模板动态生成程序集。

    查看关于该主题的另一个 blog post,您应该在搜索(或绑定)或“EF4 T4 模板”时找到大量信息。

    希望至少有一点帮助!

    【讨论】:

    • 您好,我可以分别为我的数据库创建 EDMX 类和 CSDL 文件。这样做没有问题。我的问题是,每当我更改 EDMX(从我的自定义框架)时,我都需要将这些类编译成 DLL(前提是我具有执行相同操作的文件夹权限)。从网页按钮单击。我在这个地方(编译)而不是在生成类时感到震惊。我不确定如何从网站调用 CSC(在服务器中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 2014-07-30
    • 1970-01-01
    • 2014-10-26
    相关资源
    最近更新 更多