【问题标题】:Is it bad practice to add functionality to EF entities using partial classes?使用部分类向 EF 实体添加功能是不好的做法吗?
【发布时间】:2010-08-01 08:30:26
【问题描述】:

我正在使用 MVVM 模式构建一个小型计时应用程序,并使用实体框架进行持久性。在这个阶段,我的逻辑很薄,因为我只需要对相关数据执行一些计算和聚合。目前,我已经通过将它们编写在实体类的部分类中来实现这些。

例如:

// entity framework generated
partial class Lap {
  int Id { /* boilerplate */ }
  DateTime StartTime { /* etc */ }
  DateTime EndTime { /* etc */ }
}

// in my partial class (written by me)
partial class Lap {
  TimeSpan Duration {
    get { return EndTime - StartTime; }
  }
}

将额外的逻辑直接放到实体生成的类上是不好的做法吗?我应该为这个逻辑创建另一个领域层吗?

【问题讨论】:

    标签: entity-framework mvvm


    【解决方案1】:

    您正在做的正是为部分类设计的事情;将相关逻辑添加到代码生成的类中,而不会使继承树陷入困境。坚持下去。

    加法:

    来自所有部落知识字体的页面,Wikipedia(强调添加):

    部分类的目的是 允许一个类的定义跨越 跨多个文件。这是 特别适用于:

    • 非常大的类(使用编辑器导航很麻烦 通过单个文件)
    • 关注点分离,类似于面向方面的编程 但不使用任何额外的工具。一个 示例如下所示。
    • 允许多个开发人员同时处理一个类 时间无需稍后 在源代码管理中合并文件。
    • 允许在类接口和 与实现相关的定义 (公众的不同定义 和私处)
    • 简化代码生成器的编写,例如视觉设计师。 这可能是最有用的 原因。 开发是一个挑战 可以管理的代码生成器 放入时生成的代码 人工编写的代码:
      • 需要大量解析不必要的代码,只是为了找到一个 插入生成的代码的地方。 修改代码也是一个问题。 写得不好的生成器持有 潜在的损坏整个风险 文件。

    使用部分类,代码 生成器处理一个单独的文件, 并因此从所有的 上面提到的问题。

    【讨论】:

    • 我完全同意这个回复,并在我们的许多解决方案中实施这个设计。我发现有用的一件事是尝试并保持一个约定存储部分的位置。我们喜欢将 T4 生成的 POCO 类提取到我们单独的模型集合中,然后包含一个名为 Behaviors 的附加文件夹,其中包含所有相关的部分类。无论什么适合你,只要保持一致即可。
    • +1 为答案。如果可以的话,我会再给你一个 +1 来鼓励你,看到它总是很高兴。
    【解决方案2】:

    我不得不承认对 POCO 这样做并且发现它非常有成效。其他常见用途

    • 全名 = 名 + " " + 姓
    • CostIncl = Excl + Tax
    • 有时还可以汇总子实体中的总计(例如 InvoiceTotal = 所有 LineItem.Totals 的总和)

    有一些注意事项

    • 如果您直接通过网络发送这些实体(例如 WCF 或 ASMX),请确保它们未标记为 Serializable / DataMember,因为如果没有设置器,它们将无法序列化
    • 如果您不这样做(例如,跨线路映射它们或用于 MVVM 目的),您将需要重复努力
    • 编辑:根据 Stephen 的评论,在 LINQ 查询(命中 SQL)中使用派生属性将失败(因为它无法映射到 SQL)。

    【讨论】:

    • 一个额外的警告:当您定义自定义属性时,例如Fullname { get { return Firstname + " " + Surname; } }(或Duration 在他的情况下),请注意,在 LINQ 查询中使用此属性将在运行时失败。
    • 感谢 Steven 的提醒。像averageDuration = Laps.Average(lap => lap.Duration.Milliseconds) 这样的东西也会失败吗?这仅适用于 IQueryable 查询(即使用 EF)还是在 linq-to-objects 中也会失败?例如Laps.AsEnumerable().Average(lap => lap.Duration.Milliseconds)
    【解决方案3】:

    在使用实体框架时使用实体的部分类也不错。但是,您只需要确保不会在分部类的成员中将业务逻辑与数据访问逻辑混为一谈。否则,不连接数据库就很难编写单元测试代码。

    WPF Application Framework (WAF)BookLibrary 示例显示了当域层使用 EF 实体时 WPF MVVM 应用程序的外观。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-13
      • 2021-03-23
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 2011-06-16
      相关资源
      最近更新 更多