Aplikasi MVC 5 default dilengkapi dengan kode ini di IdentityModels.cs - kode ini untuk semua operasi ASP.NET Identity untuk templat default:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
}
Jika saya merancah pengontrol baru menggunakan tampilan dengan Entity Framework dan membuat "konteks data baru ..." dalam dialog, saya mendapatkan ini dihasilkan untuk saya:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
namespace WebApplication1.Models
{
public class AllTheOtherStuffDbContext : DbContext
{
// You can add custom code to this file. Changes will not be overwritten.
//
// If you want Entity Framework to drop and regenerate your database
// automatically whenever you change your model schema, please use data migrations.
// For more information refer to the documentation:
// http://msdn.microsoft.com/en-us/data/jj591621.aspx
public AllTheOtherStuffDbContext() : base("name=AllTheOtherStuffDbContext")
{
}
public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
}
}
Jika saya membuat scaffold pengontrol + tampilan lain menggunakan EF, misalnya untuk model Animal, baris baru ini akan di-autogenerasi tepat di bawah public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
- seperti ini:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
namespace WebApplication1.Models
{
public class AllTheOtherStuffDbContext : DbContext
{
// You can add custom code to this file. Changes will not be overwritten.
//
// If you want Entity Framework to drop and regenerate your database
// automatically whenever you change your model schema, please use data migrations.
// For more information refer to the documentation:
// http://msdn.microsoft.com/en-us/data/jj591621.aspx
public AllTheOtherStuffDbContext() : base("name=AllTheOtherStuffDbContext")
{
}
public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
public System.Data.Entity.DbSet<WebApplication1.Models.Animal> Animals { get; set; }
}
}
ApplicationDbContext
(untuk semua hal ASP.NET Identity) mewarisi dari IdentityDbContext
mana pada gilirannya mewarisi dari DbContext
.
AllOtherStuffDbContext
(untuk barang-barang saya sendiri) mewarisi dari DbContext
.
Jadi pertanyaan saya adalah:
Manakah dari dua ini ( ApplicationDbContext
dan AllOtherStuffDbContext
) yang harus saya gunakan untuk semua model saya yang lain? Atau haruskah saya hanya menggunakan autogenerated default ApplicationDbContext
karena seharusnya tidak menjadi masalah menggunakannya karena berasal dari kelas dasar DbContext
, atau akankah ada beberapa overhead? Anda harus menggunakan hanya satu DbContext
objek di aplikasi Anda untuk semua model Anda (saya pernah membaca ini di suatu tempat) jadi saya bahkan tidak perlu mempertimbangkan untuk menggunakan keduanya ApplicationDbContext
dan AllOtherStuffDbContext
dalam satu aplikasi? Atau apa praktik terbaik di MVC 5 dengan ASP.NET Identity?
sumber
Jawaban:
Saya akan menggunakan kelas konteks tunggal mewarisi dari IdentityDbContext. Dengan cara ini Anda dapat membuat konteks menyadari setiap hubungan antara kelas Anda dan IdentityUser dan Peran dari IdentityDbContext. Ada sedikit sekali overhead dalam IdentityDbContext, ini pada dasarnya adalah DbContext biasa dengan dua DbSet. Satu untuk pengguna dan satu untuk peran.
sumber
Ada banyak kebingungan tentang IdentityDbContext , pencarian cepat di Stackoverflow dan Anda akan menemukan pertanyaan-pertanyaan ini:
" Mengapa Asp.Net Identity IdentityDbContext Black-Box?
Bagaimana saya bisa mengubah nama tabel saat menggunakan Visual Studio 2013 AspNet Identity?
Gabungkan MyDbContext dengan IdentityDbContext "
Untuk menjawab semua pertanyaan ini, kita perlu memahami bahwa IdentityDbContext hanyalah kelas yang diwarisi dari DbContext.
Mari kita lihat sumber IdentityDbContext :
Berdasarkan kode sumber jika kita ingin menggabungkan IdentityDbContext dengan DbContext kita, kita memiliki dua opsi:
Opsi Pertama:
Membuat DbContext yang mewarisi dari IdentityDbContext dan memiliki akses ke kelas.
Catatan tambahan:
1) Kami juga dapat mengubah nama tabel asp.net Identity default dengan solusi berikut:
2) Selanjutnya kami dapat memperluas setiap kelas dan menambahkan properti apa pun ke kelas seperti 'IdentityUser', 'IdentityRole', ...
Untuk menghemat waktu, kita dapat menggunakan AspNet Identity 2.0 Extensible Project Template untuk memperluas semua kelas.
Opsi kedua:(Tidak disarankan)
Kita sebenarnya tidak harus mewarisi dari IdentityDbContext jika kita menulis sendiri semua kodenya.
Jadi pada dasarnya kita bisa mewarisi dari DbContext dan mengimplementasikan versi "OnModelCreating (pembangun ModelBuilder)" dari kode sumber IdentityDbContext kami
sumber
Ini adalah entri terlambat untuk orang-orang, tetapi di bawah ini adalah implementasi saya Anda juga akan melihat saya mematikan kemampuan untuk mengubah jenis standar KEYs: detail tentang yang dapat ditemukan di artikel berikut:
CATATAN:
Perlu dicatat bahwa Anda tidak dapat menggunakan
Guid's
kunci Anda. Ini karena di bawah tenda mereka adalahStruct
, dan dengan demikian, tidak memiliki unboxing yang akan memungkinkan konversi mereka dari generik<TKey>
parameter .KELAS TERLIHAT SEPERTI:
sumber
Jika Anda menelusuri abstraksi dari IdentityDbContext Anda akan menemukan bahwa itu terlihat seperti DbContext Anda. Rute termudah adalah jawaban Olav, tetapi jika Anda ingin lebih mengontrol apa yang sedang dibuat dan sedikit ketergantungan pada paket - paket Identitas, lihat pertanyaan dan jawaban saya di sini . Ada contoh kode jika Anda mengikuti tautan, tetapi dalam ringkasan Anda hanya menambahkan DbSet yang diperlukan ke subkelas DbContext Anda sendiri.
sumber