Apakah mungkin untuk menggunakan Identitas Asp.net baru dengan Database First dan EDMX? Atau hanya dengan kode dulu?
Inilah yang saya lakukan:
1) Saya membuat Proyek MVC5 baru dan membuat Identitas baru membuat tabel Pengguna dan Peran baru di database saya.
2) Saya kemudian membuka file EDMX Pertama Database saya dan menyeret tabel Pengguna Identitas baru karena saya memiliki tabel lain yang terkait dengannya.
3) Setelah menyimpan EDMX, generator POCO Pertama Database akan otomatis membuat kelas Pengguna. Namun, UserManager dan RoleManager mengharapkan kelas Pengguna mewarisi dari namespace Identity baru (Microsoft.AspNet.Identity.IUser), jadi menggunakan kelas Pengguna POCO tidak akan berfungsi.
Saya kira solusi yang mungkin adalah mengedit Kelas Generasi POCO saya agar kelas Pengguna saya diwarisi dari IUser?
Atau apakah ASP.NET Identity hanya kompatibel dengan Code First Design?
+++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++
Pembaruan: Mengikuti saran Anders Abel di bawah ini, inilah yang saya lakukan. Berhasil, tapi saya bertanya-tanya apakah ada solusi yang lebih elegan.
1) Saya memperluas kelas Pengguna entitas saya dengan membuat kelas parsial dalam namespace yang sama dengan entitas yang saya buat secara otomatis.
namespace MVC5.DBFirst.Entity
{
public partial class AspNetUser : IdentityUser
{
}
}
2) Saya mengubah DataContext saya untuk mewarisi dari IdentityDBContext, bukan DBContext. Perhatikan bahwa setiap kali Anda memperbarui EDMX dan membuat ulang kelas DBContext dan Entitas, Anda harus menyetelnya kembali ke ini.
public partial class MVC5Test_DBEntities : IdentityDbContext<AspNetUser> //DbContext
3) Dalam kelas entitas Pengguna yang dibuat secara otomatis, Anda harus menambahkan kata kunci penggantian ke 4 bidang berikut atau beri komentar pada bidang ini karena diwarisi dari IdentityUser (Langkah 1). Perhatikan bahwa setiap kali Anda memperbarui EDMX dan membuat ulang kelas DBContext dan Entitas, Anda harus menyetelnya kembali ke ini.
override public string Id { get; set; }
override public string UserName { get; set; }
override public string PasswordHash { get; set; }
override public string SecurityStamp { get; set; }
sumber
Jawaban:
Seharusnya mungkin untuk menggunakan sistem identitas dengan POCO dan Database First, tetapi Anda harus membuat beberapa penyesuaian:
partial
. Itu akan memungkinkan Anda untuk menyediakan implementasi tambahan dalam file terpisah.User
kelas di file lainpartial User : IUser { }
Itu akan membuat
User
kelas mengimplementasikan antarmuka yang benar, tanpa menyentuh file yang dihasilkan sebenarnya (mengedit file yang dihasilkan selalu merupakan ide yang buruk).sumber
Langkah saya sangat mirip tetapi saya ingin berbagi.
1) Buat proyek MVC5 baru
2) Buat Model.edmx baru. Meskipun itu adalah database baru dan tidak memiliki tabel.
3) Edit web.config dan ganti string koneksi yang dihasilkan ini:
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-SSFInventory-20140521115734.mdf;Initial Catalog=aspnet-SSFInventory-20140521115734;Integrated Security=True" providerName="System.Data.SqlClient" />
dengan connectionstring ini:
<add name="DefaultConnection" connectionString="Data Source=.\SQLExpress;database=SSFInventory;integrated security=true;" providerName="System.Data.SqlClient" />
Setelah itu, buat dan jalankan aplikasi. Daftarkan pengguna dan kemudian tabel akan dibuat.
sumber
EDIT: Identitas ASP.NET dengan EF Database First untuk MVC5 Template Proyek CodePlex.
Saya ingin menggunakan database yang sudah ada dan membuat hubungan dengan ApplicationUser. Ini adalah bagaimana saya melakukannya menggunakan SQL Server tetapi ide yang sama mungkin akan bekerja dengan DB apa pun.
:base("DefaltConnection")
untuk menggunakan DbContext proyek Anda.Edit: Diagram Kelas Identitas Asp.Net
sumber
IdentityUser
tidak ada gunanya di sini karena ini adalah objek kode-pertama yang digunakan olehUserStore
untuk otentikasi. Setelah mendefinisikan objek saya sendiriUser
, saya mengimplementasikan kelas parsial yang mengimplementasikanIUser
yang digunakan olehUserManager
kelas. Saya inginId
s saya menjadiint
bukan string jadi saya hanya mengembalikan UserID's toString (). Demikian pula saya inginn
diUsername
menjadi uncapitalized.public partial class User : IUser { public string Id { get { return this.UserID.ToString(); } } public string UserName { get { return this.Username; } set { this.Username = value; } } }
Anda tidak perlu
IUser
. Ini hanya antarmuka yang digunakan olehUserManager
. Jadi, jika Anda ingin mendefinisikan "IUser" yang berbeda, Anda harus menulis ulang kelas ini untuk menggunakan implementasi Anda sendiri.public class UserManager<TUser> : IDisposable where TUser: IUser
Anda sekarang menulis milik Anda sendiri
UserStore
yang menangani semua penyimpanan pengguna, klaim, peran, dll. Menerapkan antarmuka dari semua yang dilakukan kode pertamaUserStore
dan ubahwhere TUser : IdentityUser
kewhere TUser : User
tempat "Pengguna" adalah objek entitas Andapublic class MyUserStore<TUser> : IUserLoginStore<TUser>, IUserClaimStore<TUser>, IUserRoleStore<TUser>, IUserPasswordStore<TUser>, IUserSecurityStampStore<TUser>, IUserStore<TUser>, IDisposable where TUser : User { private readonly MyAppEntities _context; public MyUserStore(MyAppEntities dbContext) { _context = dbContext; } //Interface definitions }
Berikut adalah beberapa contoh tentang beberapa implementasi antarmuka
async Task IUserStore<TUser>.CreateAsync(TUser user) { user.CreatedDate = DateTime.Now; _context.Users.Add(user); await _context.SaveChangesAsync(); } async Task IUserStore<TUser>.DeleteAsync(TUser user) { _context.Users.Remove(user); await _context.SaveChangesAsync(); }
Dengan menggunakan template MVC 5, saya mengubah tampilan
AccountController
menjadi seperti ini.public AccountController() : this(new UserManager<User>(new MyUserStore<User>(new MyAppEntities()))) { }
Sekarang masuk harus bekerja dengan tabel Anda sendiri.
sumber
Lihat proyek ini di GitHub: https://github.com/KriaSoft/AspNet.Identity
Yang mencakup:
Juga lihat : Cara membuat penyedia Database-First untuk ADO.NET Identity
sumber
Pertanyaan bagus.
Saya lebih dari orang yang mengutamakan database. Paradigma pertama kode tampaknya membuat saya pusing, dan "migrasi" tampaknya terlalu rentan terhadap kesalahan.
Saya ingin menyesuaikan skema identitas aspnet, dan tidak diganggu dengan migrasi. Saya berpengalaman dengan proyek database Visual Studio (sqlpackage, data-dude) dan bagaimana ia melakukan pekerjaan yang cukup baik dalam meningkatkan skema.
Solusi sederhana saya adalah:
1) Buat proyek database yang mencerminkan skema identitas aspnet 2) gunakan keluaran proyek ini (.dacpac) sebagai sumber daya proyek 3) terapkan .dacpac bila diperlukan
Untuk MVC5, mengubah
ApplicationDbContext
kelas tampaknya membuat ini berjalan ...1) Terapkan
IDatabaseInitializer
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IDatabaseInitializer<ApplicationDbContext> { ... }
2) Dalam konstruktor, beri tanda bahwa kelas ini akan mengimplementasikan inisialisasi database:
Database.SetInitializer<ApplicationDbContext>(this);
3) Terapkan
InitializeDatabase
:Di sini, saya memilih untuk menggunakan DacFX dan menerapkan .dacpac saya
void IDatabaseInitializer<ApplicationDbContext>.InitializeDatabase(ApplicationDbContext context) { using (var ms = new MemoryStream(Resources.Binaries.MainSchema)) { using (var package = DacPackage.Load(ms, DacSchemaModelStorageType.Memory)) { DacServices services = new DacServices(Database.Connection.ConnectionString); var options = new DacDeployOptions { VerifyDeployment = true, BackupDatabaseBeforeChanges = true, BlockOnPossibleDataLoss = false, CreateNewDatabase = false, DropIndexesNotInSource = true, IgnoreComments = true, }; services.Deploy(package, Database.Connection.Database, true, options); } } }
sumber
Saya menghabiskan beberapa jam mengerjakan ini dan akhirnya menemukan solusi yang telah saya bagikan di blog saya di sini . Pada dasarnya, Anda perlu melakukan semua yang dikatakan dalam jawaban stink tetapi dengan satu hal tambahan: memastikan Identity Framework memiliki string koneksi SQL-Client tertentu di atas string koneksi Entity Framework yang digunakan untuk entitas aplikasi Anda.
Singkatnya, aplikasi Anda akan menggunakan string koneksi untuk Identity Framework dan satu lagi untuk entitas aplikasi Anda. Setiap string koneksi memiliki tipe yang berbeda. Baca posting blog saya untuk tutorial lengkap.
sumber
Saya menemukan bahwa @ JoshYates1980 memang memiliki jawaban yang paling sederhana.
Setelah serangkaian uji coba dan kesalahan saya melakukan apa yang disarankan Josh dan menggantinya
connectionString
dengan string koneksi DB yang saya hasilkan. yang membuat saya bingung awalnya adalah postingan berikut:Cara menambahkan otentikasi identitas ASP.NET MVC5 ke database yang ada
Dimana jawaban yang diterima dari @Win menyatakan untuk mengubah
ApplicationDbContext()
nama koneksi. Ini agak kabur jika Anda menggunakan Entitas dan pendekatan pertama Database / Model di mana string koneksi database dibuat dan ditambahkan keWeb.config
file.Nama
ApplicationDbContext()
koneksi dipetakan ke koneksi default diWeb.config
file. Oleh karena itu, metode Josh bekerja paling baik, tetapi untuk membuatnyaApplicationDbContext()
lebih mudah dibaca, saya sarankan mengubah nama ke nama database Anda sebagai @Win yang awalnya diposting, pastikan untuk mengubahconnectionString
untuk "DefaultConnection" diWeb.config
dan mengomentari dan / atau menghapus Entitas database yang dihasilkan termasuk.Contoh Kode:
sumber
Kami memiliki proyek DLL Model Entitas tempat kami menyimpan kelas model kami. Kami juga menyimpan Proyek Database dengan semua skrip database. Pendekatan saya adalah sebagai berikut
1) Buat proyek Anda sendiri yang memiliki EDMX menggunakan database terlebih dahulu
2) Buat skrip tabel di db Anda, saya menggunakan VS2013 yang terhubung ke localDB (Koneksi Data) dan menyalin skrip ke proyek database, menambahkan kolom kustom apa pun, misalnya Tanggal Lahir [DATE] bukan null
3) Terapkan database
4) Perbarui proyek Model (EDMX) Tambahkan ke proyek Model
5) Tambahkan kolom kustom ke kelas aplikasi
public class ApplicationUser : IdentityUser { public DateTime BirthDate { get; set; } }
Dalam proyek MVC, AccountController menambahkan yang berikut ini:
Penyedia Identitas menginginkan SQL Connection String agar berfungsi, untuk menyimpan hanya 1 string koneksi untuk database, ekstrak string penyedia dari string koneksi EF
public AccountController() { var connection = ConfigurationManager.ConnectionStrings["Entities"]; var entityConnectionString = new EntityConnectionStringBuilder(connection.ConnectionString); UserManager = new UserManager<ApplicationUser>( new UserStore<ApplicationUser>( new ApplicationDbContext(entityConnectionString.ProviderConnectionString))); }
sumber