Skip to main content

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

Comments

Post a Comment

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

Popular posts from this blog

How to create Rest API(Web API) with ASP.NET Core 1.0

Recently Microsoft has released ASP.NET Core 1.0 RC2, I am getting lots of request from readers that about creating Web API. So I thought it will be a good idea to write a blog post about how to create Rest API(Web API) with ASP.NET Core 1.0.

So let’s get started via creating an ASP.NET Core 1.0 Web Application like following.



Once you click on ASP.NET Web Application, It will ask whether you need to create Web Application or Web API application. We are going to Web API so I am going to select Web API Application like following. Please note that in ASP.NET Core 1.0 there is no separate libraries or DLLs required for creating web APIs. This is just a project template.



Now once you click on OK It will create a Web API application with default values controller and program.cs.  As you know Program.cs is now starting point for the ASP.NET Core 1.0 application so It contains all the required configuration and startup items. Following is a code for that.
using System.IO; using Microsoft.Asp…

How to use migration with Entity Framework Core

Entity framework core is  the lightweight, extensible and cross-platform version of Entity Framework. Before some time, Microsoft has Released a new version of Entity Framework RC2. I have written a couple of blog post about Entity framework code first migration earlier for Entity framework 6.0. So there was a couple of request coming for writing a blog post about Entity Framework Core RC2 migration. So I thought it will be a good idea to give an overview how database migration works in Entity Framework Core RC2. This post will cover a basic scenario where we are going to create the database with existing ASP.NET Identity migration and then we are going to create a new model and have that migration applied in the database.

How to use Entity Framework Migrations: Let’s get started, To demonstrate entity framework core migrations, I am going to create a sample asp.net core web application like following.



Once we select asp.net core application it will appear the following dialog.



Now w…

Creating PDF with ASP.Net MVC and RazorPDF

Update: I have written a new blog post about better approach to create a PDF with asp.net mvc- You can find that following location.- A Better Solution to create PDF with Rotativa and ASP.NET MVC
In this post we are going to learn how we can easily create PDF from ASP.Net application with the help of Razor PDF NuGet package.

About Razor PDF:
This NuGet package is created by Al Nyveldt It internally uses ITextSharp an open source PDF convertor library. RazorPDF uses Razor View engine to create iTextXML which is in tern used to produce PDF file. You can get more information about that at below link.

https://www.nuget.org/packages/RazorPDF

Example(Creating PDF with ASP.Net MVC):
So what we are we waiting for ? Let’s create a simple example. To create example first thing we need to a create and ASP.Net MVC application.