Skip to main content

Complex type in EFCodeFirst

I have already written a few blog post about EF Code first and it’s features following is a complete list of blog posts.

Entity framework code first and inheritance- Table Per Type
Entity Framework code first and Inheritance–Table per hierarchy
Entity Framework Code First migrations
Different way of mapping with EFCodeFirst
Different way of creating keys in EFCodeFirst

This post will also be part of this EF code first series. In this blog post we are going to learn how we can handle complex type in EF Code First. In our day to day operation we are having different kind of database tables where  there are multiple type of relationships  are defined like one-to-one, one-to-many and many-to-many. This all kind of relationship is handle by complex types.

Let’s create a simple console application for student and through this We are going to understand how EF Code First handles complex types. Following is our model implementation.
public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public string PostalCode { get; set; }
}
And following is student class implementation.
public class Student
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Address StudentAddress { get; set; }
}
Now let’s create a Entity Framework Code First Data context. For that we need to add entity framework reference via NuGet Package.

entity-framework-code-first-nuget-package-complex-type

Now It’s time to add a database.

database-complex-data-type

Let’s create data context for EF Code First like following.
using System.Data.Entity;

namespace EFCodeFirstComplexType
{
    
    public class StudentContext : DbContext
    {
        public StudentContext()
            : base("DefaultConnectionString")
        {
            
        }
        public DbSet<Student> Students { get; set; }
    }
}
And here is code for my console application.
using System;

namespace EFCodeFirstComplexType
{
    class Program
    {
        static void Main(string[] args)
        {
            var studentContext = new StudentContext();
            foreach(Student student in studentContext.Students)
            {
               Console.WriteLine(student.FirstName); 
               Console.WriteLine(student.LastName);
            }
        }
    }
}
Now when you run this console application it will create a database like following.
using System;

namespace EFCodeFirstComplexType
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Student student = new Student
                {
                    Id = 1,
                    FirstName = "Jalpesh",
                    LastName = "Vadgama",
                    StudentAddress = new Address()
                };
                using (var studentContext = new StudentContext())
                {
                    studentContext.Students.Add(student);
                    studentContext.SaveChanges();
                }
            }
            catch (Exception exception)
            {
              Console.WriteLine(exception.Message);
            }
        }
    }
}
Here you can notice that I have initialized the Address object in student with keyword otherwise it will give a error the limitation of EFCodeFirst is complex type if already required.. Now once you run that application it will create following table in database.

database-table-efcodefirst-complex-type

So Here I have given property name Student Address that’s why it it created like above.

How EF Code First discovered complex type:


Here in EFCode First complex type is discovered via convention. Here EFCodeFirst determines that Student class has a property of Address type and that’s why it also included properties of Address class in to table. You can find more information about default convection in EFCode First from the following link.

http://blogs.msdn.com/b/efdesign/archive/2010/06/01/conventions-for-code-first.aspx

Explicitly Register a Complex Type:


You can also explicitly register Address class as Complex Type in EFCodeFirst with ComplexType attribute.
[ComplexType]
public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public string PostalCode { get; set; }
}
You can also defined complex type with OnModelCreating event of datacontext like following.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.ComplexType<Address>();
}

That's it. Hope you like it. Stay tuned for more about EFCodeFirst in forthcoming post.
You can find complete source code for this blog post at gihub at -https://github.com/dotnetjalps/EFCodeFirstComplexType

Comments

  1. Sorry I have just started to learn EF. Why a new table hasn't been created for the complex type?

    ReplyDelete
    Replies
    1. Complex type are just classes which have a meaning in your models but its not required they map to a table. Like in this example we have address which is an property in the student class but in the database there is no address table. You can also have complex type with another table. I will write a blog post about it.

      Delete

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…

Solution: gulp is not recognized as internal or external command- Visual Studio

Recently, After Upgrading to the newer version of Gulp, I was getting this error.  After doing lots of  finding online and in my system I was able to figure out that Modules like Gulp does not installed to the path. So when you try to run it from the command line it was showing below error.
gulp is not recognized as internal or external command How to solve : gulp is not recognized as internal or external command To solve this error we just need to create a new environment variable and set the NPM modules path there.

To create an environment variable,  Right click My Computer/ This Pc and click on properties.  It will open following windows.



Go to Advance System Settings and it will open system properties windows like below.



Click on Environment Variables it will open an environment and system variables windows like below.



Click on new System variable and put NODE_PATH in system variable name and %AppData%\npm\node_modules into the variable value like below.



Click on Ok. That’s it. N…