Shows how to add foreign key constraints using Entity Framework Code First.
Introduction
We saw in the first article EF Code First: Let's try it, how to generate a table using EF Code First. In this article, we are going to see how to define a foreign key constraint.Using the code
We want to add a new table to work with a foreign key. Let's add a newProject
class like this:
Hide Copy Code
public class Project
{
public int ProjectId { get; set; }
public string Name { get; set; }
public int ManagerId { get; set; }
public Person Manager { get; set; }
}
You can see the Manager
property is of type Person
and I added the ManagerId
property to be the key between the two tables.Now add the
DbSet
of Project
as you did for Person
:
Hide Copy Code
public DbSet Projects { get; set; }
Run the application. You should get an InvalidOperationException
: The model backing the 'MyContext
' context has changed since the database was created. Either manually delete/update the database, or callDatabase.SetInitializer
with an IDatabaseInitializer
instance. For example, theDropCreateDatabaseIfModelChanges
strategy will automatically delete and recreate the database, and optionally seed it with new data.This is because the changes we made have too many effects on the database and it should be deleted. But the EF Context can't decide itself if it can drop the database to recreate it. What's the solution? There are two solutions:
- You can delete the database yourself and rerun the application.
- You can use
SetInitializer
usingDropCreateDatabaseIfModelChanges
.
In the file MyContext.cs, add a new class:
MyInitializer
.
Hide Copy Code
public class MyInitializer : DropCreateDatabaseIfModelChanges
{
}
As you can see, the database would be dropped and recreated each time the model changes. You can do more things in the initializer but we will see that later in this post.Now we will set the initializer. Go back to Program.cs and add the following line at the beginning of the
Main
method:
Hide Copy Code
Database.SetInitializer(new MyInitializer());
Now you can run our application.What has happened? The context has detected changes in the model and so, the database has been deleted and recreated. If you check the tables in the database, you should see two tables: People and Project. The person in the
Main
method has been created in the People table. The item appears only once because the table was recreated and so, the previous record was deleted and not backed up.If we look closer, we can see a column named ManagerId and another one named Manager_PersonId.
The first one was created because of our property
ManagerId
. The second one was created because of our navigation property to the list of Person
s.EF Code First has created a foreign key for us and it's great, but what we'd want is to use the
ManagerId
property. So let's modify our Project
class to use this property vs. let Code First create it for us.To configure Code First and the way it will generate our database, there are two methods: DataAnnotation andFluent API.
Let's use DataAnnotation. Modify your class like this:
Hide Copy Code
public class Project
{
public int ProjectId { get; set; }
public string Name { get; set; }
public int ManagerId { get; set; }
[ForeignKey("ManagerId")]
public Person Manager { get; set; }
}
You should add the System.ComponentModel.DataAnnotations
namespace. Adding the ForeignKey
attribute, we say to Code First that we want the ManagerId
properties to be used as Foreign Keys to the Person table.Run the application and check your database schema. The Manager_PersonId column does not exist anymore, there is only the ManagerId column and it is declared as a foreign key to the People table.
We just created our first one to many relationship using EF Code First. As we have seen, we can declare the FK in the class or let Code First manage it for us. In the next article, we will talk about Data Annotation and Code Fluent.
Thanks for the great work. Many, many thanks.
ReplyDeletevoyance gratuite par mail rapide