Wednesday, April 1, 2015

Entity Framework Internals: Private setters and private constructors

I have been heavily learning Domain Driven Design recently and In that there is a concept called “Anemic Domain Model” which we used to use in our project. In simple terms Anemic Domain Models are those classes that do not have any behaviour with them and most of created with properties. You can use them as container for your data from database. While Domain driven design is all about behaviours. So we need to make our models incorporate behaviours also which is called  “Rich Domain models”.

One of step to convert your Anemic Domain Models to Rich Domain Models is to create parameterised constructors. For example an Employee must have FirstName and LastName. So instead of doing validation at the insertion time on UI we should not allow Employee to be created without FirstName and Lastname. The only way to do this to make this properties setters private and assign value of those properties via parameters constructors like below.
public class Employee
{
        public Employee(string firstName, string lastName)
        {
            FirstName = firstName;
            LastName = lastName;
        }
            
        public int EmployeeId { get; set; }
        public string FirstName { get; private set; }
        public string LastName { get; private set; }
        public string Designation { get; set; }
}
Now, If you want to do DDD with any Object Relational Mappers there will be a problem as most of Object Relational Mappers create properties with public setters. Entity Framework is such a Object Relational mapper and I love to work with Entity Framework.

So in this example, we are going to see how we can use private setters and private constructors with Entity Framework to convert our Anemic models into Rich Domain models. I’m going to create console application like following.

console-application-private-setter-entity-framework

After creating Application let’s add entity framework via Nuget package like following.

install-entity-framework

In this example, We are going to use Entity Framework Code First, So we are first going to create our models and based on that Database tables will be created. So as above suggested Here is the Employee class I have created.

using System.ComponentModel.DataAnnotations;

namespace PrivateSetterConstructorEF
{
    public class Employee
    {
        public Employee(string firstName, string lastName)
        {
            FirstName = firstName;
            LastName = lastName;
        }

        private Employee()
        {
            
        }
        [Key]
        public int EmployeeId { get; set; }
        public string FirstName { get; private set; }
        public string LastName { get; private set; }
        public string Designation { get; set; }
    }
}
I have made only two changes to models we have created above. One is the private constructor and another is Key attribute to EmployeeId field to let Entity Framework know that it is a primary key. Entity Framework require one parameter less constructor to map classes to a table. So I have added private constructor as our public constructor is with parameters. Entity Framework does not care about private or public constructor as internally it uses reflection to work with models.

Now, let’s create our Entity Framework context class like below.
using System.Data.Entity;

namespace PrivateSetterConstructorEF
{
    public class EmployeeContext : DbContext
    {
        public EmployeeContext() :base("DefaultConnectionString")
        {

        }
        public DbSet<Employee> Employees { get; set; }
    }
}
And following is a my console application code to check everything works fine.
using System;

namespace PrivateSetterConstructorEF
{
    class Program
    {
        static void Main(string[] args)
        {
            using (EmployeeContext employeeContext = new EmployeeContext())
            {
                Employee employee = new Employee("Jalpesh", "Vadgama");
                employeeContext.Employees.Add(employee);
                employeeContext.SaveChanges();

                Console.WriteLine("Employee Saved");
            }
        }
    }
}
Here I have created Employee object with parameterised constructors passing some value and then I saved this employee to database via adding and calling save changes methods and following is output as expected.

output-entity-framework-private-constructors-private-setters

Now Let’s check table created in SQL Server and it is good as expected.

table-created-entity-framework-private-constructors

Now let’s also see the data also.

employee-table-data-entity-framework-private-setters

It’s looks also good. That’s it. Hope you like it.
You can find complete source code for this blog post at github on - https://github.com/dotnetjalps/PrivateSetterConstructorEF
Share:

2 comments:

Your feedback is very important to me. Please provide your feedback via putting comments.

About Me
My Photo

Full Stack Developer,Blogger,Microsoft Mvp, Mentor, Life long learner, 10+ Years of Experience for JavaScript, web and Microsoft technologies. ASP.NET MVC,Web Forms,C#,AngularJs,Golang
Mvp profile
Subscribe to my blog

Enter your email address:

Follow us on facebook
Blog Archive
Total Pageviews