Ryan Norbauer
Ryan Norbauer

Reputation: 1708

Why the frequent unexplained use of the partial modifier in EF Code First?

In the EF Code first docs and examples, you'll frequently see classes and methods defined using the partial modifier. For example, the following

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

I understand the general use of the partial keyword by the C# compiler. However, I often see these examples without applying that functionality (i.e., the class is never re-opened elsewhere).

In other examples, I have also seen partial modifiers on methods as well.

Do these modifiers carry some special meaning in an EF Code First context? Can anyone help me understand what's going on?

Upvotes: 2

Views: 1110

Answers (3)

Brad Christie
Brad Christie

Reputation: 101594

Given EF makes working with POCOs really easy, this makes it flexible in terms of separating components and pieces. For example, a section that defines your models:

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; }
}

Then apply business logic elsewhere:

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

And maybe extend its functionality another place still:

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

though as @E.J. Brennan mentions, it's more likely they were generated from a T4 template. This means that anything you did in the generated file would be wiped with every generation; however, if you left the generated item alone, you could still extend it (like I've shown with IValidatableObject or additional methods) without worrying if your changes would be lost.

Upvotes: 4

Mads
Mads

Reputation: 444

You can extend Entity Framework generated types:

The classes only contain properties that are defined in the conceptual model and do not contain any methods. The generated classes are partial.

So, in your new partial classes (not the generated ones) you can define business logic, display attributes, validation logic etc. These classes won't be overwritten, like the generated ones.

Upvotes: 1

E.J. Brennan
E.J. Brennan

Reputation: 46841

It wouldn't be unusual to use T4, or another code generator to create the basic classes that map back to your database. If one did that, you would want those classes to be partial so that you could extend those classes in a seperate file - if you extended those classes in the original file, they would get overwritten every time you re-generated the file.

If you hand coded your classes, there would be no need to use the partial on all of them.

Upvotes: 2

Related Questions