2

在 EF Code first 文档和示例中,您会经常看到使用partial修饰符定义的类和方法。例如,以下

public partial class Department
{
    public int DepartmentID { get; set; }
    public DepartmentNames Name { get; set; }
    public decimal Budget { get; set; }
}

我了解partialC# 编译器对关键字的一般用法。但是,我经常看到这些示例没有应用该功能(即,该类永远不会在其他地方重新打开)。

在其他示例中,我也看到partial了方法上的修饰符。

这些修饰符在 EF Code First 上下文中是否具有特殊含义?谁能帮我理解发生了什么?

4

3 回答 3

4

鉴于 EF 使得使用 POCO 变得非常容易,这使得它在分离组件和片段方面变得灵活。例如,定义模型的部分:

public partial class PurchaseOrder
{
    public Int32 ID { get; set; }
    public String CustomerName { get; set; }
    public Double InvoiceAmount { get; set; }
    public virtual ICollection<PurchaseOrderItem> Items { get; set; }
}

然后在其他地方应用业务逻辑:

public partial class PurchaseOrder : IValidatableObject
{
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        // ...
    }
}

也许还可以将其功能扩展到另一个地方:

public partial class PurchaseOrder
{
    public void AddItem(PurchaseOrderItem item)
    {
        // ...
    }
}

尽管正如@EJ Brennan 提到的,它们更有可能是从 T4 模板生成的。这意味着您在生成的文件中所做的任何事情都会在每一代中被擦除;但是,如果您不理会生成的项目,您仍然可以扩展它(就像我已经展示的IValidatableObject或其他方法一样),而不必担心您的更改是否会丢失。

于 2013-07-16T20:24:29.370 回答
2

使用 T4 或其他代码生成器来创建映射回数据库的基本类并不罕见。如果这样做,您会希望这些类是部分的,以便您可以在单独的文件中扩展这些类 - 如果您在原始文件中扩展这些类,则每次重新生成文件时它们都会被覆盖。

如果您手动编码类,则无需对所有类使用部分。

于 2013-07-16T20:23:41.323 回答
1

您可以扩展实体框架生成的类型

这些类只包含在概念模型中定义的属性,不包含任何方法。生成的类是部分的。

因此,在您的新部分类(不是生成的部分)中,您可以定义业务逻辑、显示属性、验证逻辑等。这些类不会像生成的类一样被覆盖。

于 2013-07-16T20:25:57.203 回答