diff --git a/integrations/entity-framework.md b/integrations/entity-framework.md
new file mode 100644
index 0000000..40a1f8e
--- /dev/null
+++ b/integrations/entity-framework.md
@@ -0,0 +1,103 @@
+# Entity Framework 6.x integration
+
+## Basic configuration
+
+To configure OpenIddict to use Entity Framework 6.x as the database for applications, authorizations, scopes and tokens, you'll need to:
+ - **Reference the `OpenIddict.EntityFramework` package**:
+
+ ```xml
+
+ ```
+
+ - **Create a database context deriving from `DbContext` and register the OpenIddict entities in the model**:
+
+ ```csharp
+ public class ApplicationDbContext : DbContext
+ {
+ protected override void OnModelCreating(DbModelBuilder modelBuilder)
+ {
+ base.OnModelCreating(modelBuilder);
+
+ modelBuilder.UseOpenIddict();
+ }
+ }
+ ```
+
+ - **Configure OpenIddict to use the Entity Framework 6.x stores**:
+
+ ```csharp
+ services.AddOpenIddict()
+ .AddCore(options =>
+ {
+ options.UseEntityFramework()
+ .UseDbContext();
+ });
+ ```
+
+ - **Use migrations or recreate the database to add the OpenIddict entities**.
+For more information, read [Code First Migrations](https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/migrations/).
+
+## Advanced configuration
+
+### Use a custom primary key type
+
+By default, the Entity Framework 6.x integration uses `string` primary keys, which matches the default key type used by ASP.NET Identity.
+
+> [!WARNING]
+> Unlike Entity Framework Core, Entity Framework 6.x doesn't support closed generic types, which prevents using the OpenIddict entities
+> without subclassing them. As such, using a custom primary key type is a bit more complicated with Entity Framework 6.x than with
+> Entity Framework Core and requires implementing custom entities, as highlighted in the next section.
+
+### Use custom entities
+
+For applications that require storing additional data alongside the properties used by OpenIddict, custom entities can be used. For that, you need to:
+ - **Create custom entities**:
+
+ ```csharp
+ public class CustomApplication : OpenIddictEntityFrameworkApplication
+ {
+ public string CustomProperty { get; set; }
+ }
+
+ public class CustomAuthorization : OpenIddictEntityFrameworkAuthorization
+ {
+ public string CustomProperty { get; set; }
+ }
+
+ public class CustomScope : OpenIddictEntityFrameworkScope
+ {
+ public string CustomProperty { get; set; }
+ }
+
+ public class CustomToken : OpenIddictEntityFrameworkToken
+ {
+ public string CustomProperty { get; set; }
+ }
+ ```
+
+ - **Call the generic `ReplaceDefaultEntities()` method to force OpenIddict to use the custom entities**:
+
+ ```csharp
+ services.AddOpenIddict()
+ .AddCore(options =>
+ {
+ // Configure OpenIddict to use the custom entities.
+ options.UseEntityFramework()
+ .UseDbContext()
+ .ReplaceDefaultEntities();
+ });
+ ```
+
+ - **Register the custom entities in the model**:
+
+ ```csharp
+ public class ApplicationDbContext : DbContext
+ {
+ protected override void OnModelCreating(DbModelBuilder modelBuilder)
+ {
+ base.OnModelCreating(modelBuilder);
+
+ modelBuilder.UseOpenIddict();
+ }
+ }
+ ```
\ No newline at end of file
diff --git a/integrations/toc.yml b/integrations/toc.yml
index f3a4a32..62254c9 100644
--- a/integrations/toc.yml
+++ b/integrations/toc.yml
@@ -1,6 +1,9 @@
- name: Introduction
href: index.md
+- name: Entity Framework
+ href: entity-framework.md
+
- name: Entity Framework Core
href: entity-framework-core.md