【问题标题】:Understanding POCO Generators了解 POCO 生成器
【发布时间】:2012-02-12 21:54:09
【问题描述】:

我试图了解 .NET 中的 poco 生成器应该做什么。在我看来,它们应该是代码生成工具,允许我从我的 edmx 文件中选择要为其创建 POCO 的实体并根据表的字段生成类,同时允许我自定义生成的 poco 名称,因此它是不同的从我的 edmx Designer.cs 文件中生成的类名。例如:我有一个名为 Customer 的表,在 edmx 文件中被命名为 Customers。现在 poco 生成工具应该允许我创建一个名为 BusinessCustomers 的类。

然而,虽然他们在不允许我自定义生成的类名的情况下生成类,但我注意到,当从 this example 生成此类 pocos 时,它们往往是仍归代码生成工具所有的类.生成的 poco 类是一个名为 Customers 的分部类,它基本上是 edmx 类的扩展。我无法选择性地选择要为其生成 pocos 的实体。因此,如果我对生成的类进行了更改,只要我将新表添加到 edmx 文件并想使用该工具创建新的 pocos,它们就会丢失。我当然可以将生成的类复制到另一个项目并从那里使用它们,但我不确定这是否是正确的方法。 在我上面的示例中,生成的 poco 类是一个名为 Customers 的部分类,具有虚拟属性,用于表中的每个字段。 edmx Designer.cs 被擦除干净。我仍将在我的代码中使用该工具生成的类。如果我想要一个单独的 poco 类,我仍然必须自己编写它...... poco 生成器不是应该为我创建一组新的类,而保留 edmx 类吗?

至少我想要的是为我生成类的工具,并且一旦生成它就不再触摸它。如果我正确理解了 ADO.NET C# POCO 实体生成器,它就不会那样做。有没有更好的工具,还是我应该坚持手工编写 poco 类以满足我的要求?你怎么看?

对不起,如果我的问题有点令人困惑;我写这篇文章时对这个主题的理解有限,也许是不正确的。谢谢你的时间......

【问题讨论】:

    标签: .net entity-framework-4.1 poco


    【解决方案1】:

    POCO 类生成器可通过更改生成它们的 T4 模板来帮助您自定义生成过程,并将它们与包含 EDMX 的项目分开。 这对于说测试非常有帮助,您可以将 EDMX 替换为自定义生成器或其他填充您生成的类的数据馈送结构,这些类可以位于与 edmx 本身完全不同的项目中。

    至于自定义,您只需将这些类声明为 Partial(不确定这是否是默认值,但可以在 T4 模板中轻松更改)。所以你要做的是有另一个文件代表包含自定义代码的类的一部分。这样您就可以自定义您的类,而不会在重新生成它们时丢失更改。

    这么长的答案,你应该坚持使用 POCO 生成器,因为它简化了将数据库表映射到类的整个过程。

    【讨论】:

    • 顺便说一句,如果您要编辑 T4 模板,如果您以前没有做过,您可能会觉得这个任务有点儿嘲讽。有一些不错的工作室插件可以帮助使用智能感知和示例编写它们,所以请查找它们。
    • 生成的 poco 类是一个名为 Customers 的分部类,具有虚拟属性,表中的每个字段一个。 edmx Designer.cs 被擦除干净。我仍将在我的代码中使用该工具生成的类。如果我想要一个单独的 poco 类,我仍然必须自己编写它...... poco 生成器不应该为我创建一组新的类,而保留 edmx 类吗?
    • 不,POCO 生成器应该将 edmx 文件中的代码分解为单独的类,您可以 1.通过使用 T4 进行自定义,2.实际上将它们放在不同的项目中让它们成为你的类而不是 EF4 类,并在你认为合适的时候使用它们,即使你决定转储 EF,3. 扩展它们或在你认为合适的不同文件中覆盖它们..
    • 假设您在客户类中有 3 个字段。姓名、电话和债务。您在包含部分类客户的同一命名空间中创建一个文件,并添加一个属性 DebtStatus {get{return Debt>0}} 并添加一个方法 ChangePhoneNumber(string formattedPhoneNumber) 现在在您的代码中使用客户时,您有 4 个属性和一个方法。我不知道我是否有帮助,因为如果没有实际看到一些现实生活中的例子,很难解释它的用处,但确实如此。
    • 谢谢。你确实有点帮助。:) 但我认为我需要的是一个 DTO。 (可能 DTO 和 POCO 不是一回事?)我想要一大堆类,其唯一目的是保存来自 edmx 生成的类的数据。当然,如果这两个类的形状相同,那会有所帮助。这样,我的 UI 和 BL 代码中就没有 edmx 类的引用。我可以编写一个映射器,用我的 edmx 类中的值更新 DTO 类。这样,如果 edmx 发生变化,我只需要更改映射类..
    猜你喜欢
    • 2019-03-30
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2015-06-07
    • 2014-01-13
    • 2010-12-17
    • 2021-08-11
    相关资源
    最近更新 更多