c# - Defining many to many relation in code first entity framework - Stack Overflow
A relationship defines how two entities relate to each other. Most of the samples in this article use a one-to-many relationship to demonstrate. Entity Framework Relationships - Learn Entity Framework starting from The foreign key is defined in the table that represents the many end of the relationship . If I understand you are simply trying to create a many to many with a transitive table. If so this is another way to approach this. Use Fluent API to map as below.
This example produces the same result in the database as convention 1. Convention 3 Including navigation properties at both ends will also result in a one-to-many relationship, as shown below.
Convention 4 A fully defined relationship at both ends will create a one-to-many relationship, as shown below.
Configuring Entity Relationships with Entity Framework
This will create a one-to-many relationship with the NotNull foreign key column in the Students table, as shown below. If the data type of GradeId is nullable integer, then it will create a null foreign key.
However, you may configure relationships using Fluent API at one place to make it more maintainable. Consider the following Student and Grade entity classes. First, we need to start configuring with any one entity class.
CurrentGrade specifies that the Student entity has required the CurrentGrade property. This will create a NotNull foreign key column in the DB.
Now, it's time to configure the other end of the relationship - the Grade entity.
Configure Many-to-Many Relationships in Code-First
Every object can have a navigation property for every relationship in which it participates. Navigation properties allow you to navigate and manage relationships in both directions, returning either a reference object if the multiplicity is either one or zero-or-one or a collection if the multiplicity is many.
You may also choose to have one-way navigation, in which case you define the navigation property on only one of the types that participates in the relationship and not on both.
It is recommended to include properties in the model that map to foreign keys in the database. With foreign key properties included, you can create or change a relationship by modifying the foreign key value on a dependent object. This kind of association is called a foreign key association.
Using foreign keys is even more essential when working with disconnected entities. Note, that when working with 1-to-1 or 1-to When foreign key columns are not included in the model, the association information is managed as an independent object.
Relationships are tracked through object references instead of foreign key properties. This type of association is called an independent association. The most common way to modify an independent association is to modify the navigation properties that are generated for each entity that participates in the association.
You can choose to use one or both types of associations in your model. However, if you have a pure many-to-many relationship that is connected by a join table that contains only foreign keys, the EF will use an independent association to manage such many-to-many relationship. The following image shows a conceptual model that was created with the Entity Framework Designer.
- Updating many to many relationships in Entity Framework Core
- Configuring One To Many Relationships in Entity Framework Core
The model contains two entities that participate in one-to-many relationship. Both entities have navigation properties. Course is the depend entity and has the DepartmentID foreign key property defined. The following code snippet shows the same model that was created with Code First. For information on setting up relationships in your model, see the following pages.
Relationships, navigation properties and foreign keys
Add book ; context. SaveChanges ; Updating a many-to-many relationship It turns out there are two scenarios under which you want to update a relationship. You find this sort of update that happens in a console application, or inside your business logic see this link on business logic and EF Core Disconnected state: This is where the update is split into two halves: This happens on web sites, where in the first stage the user picks what they want done and posts it back.
The second stage then has to re-read the data and update it. I am going to describe these two approaches separately, so you can go to the one that fits the application you are building. Connected state update In the connected state we read in the Book entity and update it immediately, i. I am using a Sqlite, in-memory database, which I seed with four books with known titles and authors.
Here I load the Book entity using an Include method to load the AuthorLinks at the same time, as tracked entities. The default way of loading data in EF Core is as tracked entities, that is, EF Core takes a copy of the loaded data so that it can detect if any changes have happened since they were loaded.
You can turn off tracking by including the method.
AsNoTracking to your query useful in read-only queries, as it makes them a little faster. Summary — Connected state many-to-many update To update a many-to-many relationship in the connected state: In my example I loaded the Book entity I wanted to change along with its AuthorLinks property, which holds the collection of the linking entities in the BookAuthor table. Alter the linking table collection, either by adding or removing entries from the collection.
Disconnected state The disconnected state happens when the initial read of the data and update of the data are done separately, i. This happens in a web application which has two stages: The first stage is where the user is presented with the book, its current author s and a list of possible authors to choose from.
Once they have chosen the author to add then press a button which takes their choice back to the web application In the second stage the web application needs to re-read the data and execute the database update. This unit test uses two, separate instances of the DbContext to simulate the disconnected state. With the help of Daria see comment below I have found a way to use Sqlite in-memory with multiple instances of the DbContext. Summary — Disconnected state many-to-many update To update a many-to-many relationship in the disconnected state: