Entity Framework Core Relationships with Fluent API by Henrique Siebert Domareski Medium

Registers a type as a complex type in the model and returns an object that can be used to configure the complex type. This method can be called multiple times for the same type to perform multiple lines of configuration. It allows you to configure default database schema to be used for tables.

fluent api

When the database is generated you will see that the relationship is created as shown in the following image. When the database is generated you will see that relationship is created as shown in the following image. To configure one-to-zero or one relationship between Student and StudentLogIn using Fluent API, you need to override OnModelCreating method as shown in the following code. Let’s take a look at the following example where we will add another class into our model to create a one-to-one relationship. When the database is generated you see the following tables in your database as shown in the following image.

Configurations are added to the ModelBuilder using an ApplyConfiguration method instead of being added to a Configurations collection. For example, the Student table and the Course table have many-to-many relationship. Some of them are available in the data annotations and you can apply some even more complicated ones with a Fluent API.

This code centric approach to building an Entity Data Model is known as Code First. Migration is a way to update the database in an incrementally way. So always when you create a new entity class in the application, or when you change some existing entity, you need to generate a new migration and update the database with this migration.

Separate Configuration Classes

You can create such a relationship by defining a third table, called a junction table, whose primary key consists of the foreign keys from both table A and table B. Instances of the entity type will not be able to be saved to the database unless this relationship is specified. Note that a “fluent interface” means more than just method cascading via chaining; it entails designing an interface that reads like a DSL, using other techniques like “nested functions and object scoping”. You can configure data models using Data Annotations or Fluent API. Data Annotations gives the only subset of configurations, Fluent API provides full set of configuration options available for code first. Probably the most important thing to notice about this style is that the intent is to do something along the lines of an internalDomainSpecificLanguage.

This is especially useful when we want to create a chain of commands and allow the client to apply these as required. The Fluent API provides a larger range of configuration options than Data Annotation attributes. Fluent API configuration also facilitates cleaner code, in that the configuration can be kept separate from the domain classes. Following are the Student and Course classes in which Student and Course has many-tomany relationship, because both classes have navigation properties Students and Courses that are collections.

  • JMock makes a big point of moving its types depending on what’s likely to be needed next.
  • Instead of creating a customer class, we can create a data context which can be decorated with fluent interface as follows.
  • The diagram consists of nodes, which illustrate possible API states, and labeled, directed edges between them, describing API methods that apply state transitions.

EF Fluent API is based on a Fluent API design pattern (a.k.a Fluent Interface) where the result is formulated by method chaining. Entity Framework Core Fluent API is used to build model based on entity classes. We can also override the default Conventions of Entity Framework Core using Fluent API when targetting the database schema as Fluent API has higher precedence than conventions and data annotations. Fluent API is used to configure data models to override conventions.

The more the use of the API has that language like flow, the more fluent it is. We can now model these stages as interfaces now, and use the transition between these stages to determine the return type of each methods. There are multiple ways regarding the process about designing a fluent API, for example this article shows a great process on it, by defining various grammar rules and then using them to create interfaces.

Requirement of Domain Knowledge

In Raku, there are many approaches, but one of the simplest is to declare attributes as read/write and use the given keyword. The type annotations are optional, but the native gradual typing makes it much safer to write directly to public attributes. The following table lists important methods for each type of configuration. As we already mentioned the three parts of an API — object, options, and result — we will start with the order that the “Order” interface will represent. A highlight is that this interface has some interfaces, which will be responsible for demonstrating our options. In practice, creating a fluent API means developing an API in which it is unnecessary to memorize the next steps or methods, allowing for a natural and continuous sequence as if it were a menu of options.

You can have a one entity class that maps to multiple tables from the same database . For example, Product data model will have details for Product as well as it’s inventory details. However at database level Products and Product inventory details needs to be in separate tables. Since I wrote this post Creating an Investing App: Tips & Recommendations this term’s been used rather widely, which gives me a nice feeling of tingly gratification. I’ve refined my ideas about fluent interfaces and internal DSLs in the book I’ve been working on. I’ve also noticed a common misconception – many people seem to equate fluent interfaces with Method Chaining.

fluent api

I was intrigued by the class design for this library and then I recalled, hey this API looks a lot like how LINQ methods are used in C# as well. Here you can see that every function returns the existing class in order to create a Fluent API chain. However, the final function “GetData” returns the main expected value. The ACM Special Interest Group on Programming Languages explores programming language concepts and tools, focusing on design, implementation, practice, and theory. Its members are programming language developers, educators, implementers, researchers, theoreticians, and users.

Update or create a related record

You can also see the setter method FromImage that adds content to the object and returns it back, which will enable us to use “method-chaining” on our objects. Here I am using StringBuilder to store the actual string content of the dockerfile and the setters are essentially just adding content to this string builder. As you can see, my constructor is private which initializes a new object and I have a factory method that returns a new object. A introductory post talking about fluent apis, its pros and cons and how to design one for yourself from scratch.

A line item can be skippable, meaning I’d prefer to deliver without this line item rather than delay the whole order. You can always share your thoughts on this by leaving a comment on this post. If you liked what you read, you can try reading some other posts on my blog as well, and you can also connect with me on my socials.

fluent api

The navigation property for this class is an IEnumerable of Student because a course can have one or more students, so this needs to be a list. The following code will create two different tables using Code First. You can explicitly https://cryptominer.services/ mention the DataType of database column irrespective of CLR property types. If your database column name needs to be different than the property name of the Data Model you can use the HasColumnName to configure column name.


For One-To-Many relationship, it’s possible to configure the relationship using both ends of the relationship. On the example below, I implemented in both ways to show as an example. Following code sets Maximum length for ProductName column as 50 characters.

If application tries to insert/update record with NULL values Entity Framework throws DbEntityValidationException. By default Entity Framework will create Primary Key for property having name as IDor + ID. For this tutorial, we will use data models created using EF Core Code First Migration with separate assemblyThis creates two different domain classes which will be configured using Fluent API in this tutorial. In this blogpost explains how to configure entities using Fluent API of Entity Framework Core or EF6 above versions for the Code First approach. This will give you details about how to configure business rules with Fluent API methods for PrimaryKey, Unique, Index, Required, Identity, etc. Are available for relation fields when using the model’s create or update query.

In this case, Entity Framework will add additional WHERE Clause for column ProductName. So when User2 tries to update same product it’s query becomes as shown below which will return zero records because User1 already committed ProductName as “Product 2”. When columns must have values you can mark those columns as NOT NULL. Entity Framework code first should configure such properties with the IsRequired()method.

Leave A Comment