Saya memiliki MyDbContext dalam memisahkan Data Accass Lapisan proyek perpustakaan kelas. Dan saya memiliki sebuah ASP.NET MVC 5 proyek dengan default IdentityDbContext. Dua konteks menggunakan database yang sama, dan saya ingin menggunakan AspNetUsers tabel foreign key untuk beberapa tabel saya. Jadi saya ingin menggabungkan dua Konteks, dan saya ingin menggunakan ASP.NET Identitas juga.
Bagaimana saya bisa melakukan ini?
Mohon saran,
Ini adalah Konteks saya setelah bergabung:
public class CrmContext : IdentityDbContext<CrmContext.ApplicationUser> //DbContext
{
public class ApplicationUser : IdentityUser
{
public Int16 Area { get; set; }
public bool Holiday { get; set; }
public bool CanBePublic { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public CrmContext()
: base("DefaultConnection")
{
}
public DbSet<Case> Case { get; set; }
public DbSet<CaseLog> CaseLog { get; set; }
public DbSet<Comment> Comment { get; set; }
public DbSet<Parameter> Parameter { get; set; }
public DbSet<Sign> Sign { get; set; }
public DbSet<Template> Template { get; set; }
public DbSet<Read> Read { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
Di sini saya RepositoryBase kelas:
public class RepositoryBase<TContext, TEntity> : IRepositoryBaseAsync<TEntity>, IDisposable
where TContext : IdentityDbContext<CrmContext.ApplicationUser> //DbContext
where TEntity : class
{
private readonly TContext _context;
private readonly IObjectSet<TEntity> _objectSet;
protected TContext Context
{
get { return _context; }
}
public RepositoryBase(TContext context)
{
if (context != null)
{
_context = context;
//Here it is the error:
_objectSet = (_context as IObjectContextAdapter).ObjectContext.CreateObjectSet<TEntity>();
}
else
{
throw new NullReferenceException("Context cannot be null");
}
}
}
Pengecualian dari jenis 'System.Data.Entitas.ModelConfiguration.ModelValidationException'
terjadi di EntityFramework.dll tapi tidak ditangani dalam kode pengguna
Informasi tambahan: Satu atau lebih validasi kesalahan yang terdeteksi pada model generasi:
Update: saya menemukan solusi.
Aku harus menghapus konvensi penamaan ini:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
Dan bermigrasi lih ef model db, untuk mengganti nama tabel saya dengan nameing konvensi asp.net identitas. Itu bekerja sekarang!
ApplicationUser
definisi untuk anda DAL.MyDbContext
dari IdentityDbContext<ApplicationUser>
atau IdentityDbContext
MyDbContext
sekaligus menciptakan UserManager<ApplicationUser>
Anda mungkin mendapatkan pesan berikut ini jika anda mengikuti langkah-langkah di atas tetapi dapat't bekerja keluar bagaimana untuk memberikan informasi kunci. Kesalahan yang dapat anda terima adalah:
IdentityUserLogin: : EntityType 'IdentityUserLogin' tidak memiliki key yang didefinisikan. Menentukan kunci untuk ini EntityType. Konteks.IdentityUserRole: : EntityType 'IdentityUserRole' tidak memiliki key yang didefinisikan. Menentukan kunci untuk ini EntityType.
Buat dua kelas berikut
public class IdentityUserLoginConfiguration : EntityTypeConfiguration<IdentityUserLogin>
{
public IdentityUserLoginConfiguration()
{
HasKey(iul => iul.UserId);
}
}
public class IdentityUserRoleConfiguration : EntityTypeConfiguration<IdentityUserRole>
{
public IdentityUserRoleConfiguration()
{
HasKey(iur => iur.RoleId);
}
}
Di OnModelCreating metode dalam Aplikasi anda DbContext tambahkan dua konfigurasi yang diuraikan di atas untuk model:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new IdentityUserLoginConfiguration());
modelBuilder.Configurations.Add(new IdentityUserRoleConfiguration());
}
Ini sekarang harus menyingkirkan kesalahan metode ketika anda model yang sedang dibuat. Hal itu untuk saya.
It's dicatat bahwa jika anda menggabungkan DBContexts anda mengikat sebuah pendekatan otentikasi (ASP's Identitas dalam hal ini) untuk akses data implementasi (EF). Dari kode desain point of view yang bisa dilihat sebagai pencampuran kekhawatiran anda dan pelanggaran Single tanggung Jawab Prinsip.
Yang's mungkin baik-baik saja dalam sebagian besar kasus, tetapi jika anda ingin menggunakan kembali data anda di layer lain non-aplikasi web (misalnya untuk desktop atau server aplikasi) ini akan menyajikan masalah karena IdentityDbContext tinggal di Microsoft.AspNet.Identitas.EntityFramework namespace dan desktop atau server aplikasi adalah mungkin untuk menggunakan AspNet Identitas mereka sebagai mekanisme otentikasi.
Kami berada di situasi itu dan akhirnya menjaga ASP's kedua DB Konteks, yang tinggal di proyek web. Kita lalu lintas dimuat beberapa data tentang pengguna (nama depan, nama belakang, dll.) Identitas's mengaku saat pengguna masuk.
Mungkin ini thread lama, tapi artikel ini sangat membantu dalam menunjukkan bagaimana untuk mendapatkan solusi untuk pertanyaan di atas bekerja: http://blogs.msdn.com/b/webdev/archive/2014/03/20/test-announcing-rtm-of-asp-net-identity-2-0-0.aspx
Aku harus mencakup
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//....
}
karena tanpa itu, saya akan mendapatkan error berikut:
EntityType 'IdentityUserRole' tidak memiliki key yang didefinisikan. Menentukan kunci untuk ini EntityType. EntityType 'IdentityUserLogin' tidak memiliki key yang didefinisikan. Menentukan kunci untuk ini EntityType. EntitySet 'IdentityUserRoles' didasarkan pada jenis 'IdentityUserRole' yang tidak memiliki tombol yang ditetapkan. EntitySet 'IdentityUserLogins' didasarkan pada jenis 'IdentityUserLogin' yang tidak memiliki tombol yang ditetapkan.
Jika saya tambahkan konfigurasi ini seperti yang disebutkan di atas:
public class IdentityUserLoginConfiguration : EntityTypeConfiguration<IdentityUserLogin>
{
public IdentityUserLoginConfiguration()
{
HasKey(iul => iul.UserId);
}
}
public class IdentityUserRoleConfiguration : EntityTypeConfiguration<IdentityUserRole>
{
public IdentityUserRoleConfiguration()
{
HasKey(iur => iur.RoleId);
}
}
itu akan membuat tambahan kunci asing disebut Application_User.
Setelah anda mewarisi konteks dari IdentityDbContext
Anda ApplicationUser perpanjangan IdentityUser hilang navigasi sifat yang ditafsirkan sebagai kunci asing oleh Entity Framework (ini juga sangat berguna untuk navigasi dari kode anda).
public class ApplicationUser : IdentityUser
{
public Int16 Area { get; set; }
public bool Holiday { get; set; }
public bool CanBePublic { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
//*** Add the following for each table that relates to ApplicationUser (here 1-to-many)
public virtual IList<Case> Cases { get; set; } //Navigation property
//*** and inside the case class you should have
//*** both a public ApplicationUser ApplicationUser {get;set;}
//*** and a public string ApplicationUserId {get;set;} (string because they use GUID not int)
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//....
}
Saya telah memberikan jawaban yang lengkap untuk pertanyaan ini di sini. Berikut ini adalah jawaban singkat:
Berdasarkan IdentityDbContext kode sumber jika kita ingin menggabungkan IdentityDbContext dengan kami DbContext kita memiliki dua pilihan:
Pilihan pertama:
Membuat DbContext yang mewarisi dari IdentityDbContext dan memiliki akses ke kelas-kelas.
public class ApplicationDbContext
: IdentityDbContext
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
static ApplicationDbContext()
{
Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
// Add additional items here as needed
}
**Pilihan kedua:**(Tidak dianjurkan)
Kami benar-benar don't harus mewarisi dari IdentityDbContext jika kita menulis kode sendiri.
Jadi pada dasarnya kita hanya dapat mewarisi dari DbContext dan mengimplementasikan versi disesuaikan dari "OnModelCreating(ModelBuilder builder)" dari IdentityDbContext source code
Masalah itu disebabkan karena Anda menimpa isi dari metode "OnModelCreating" yang dilaksanakan di IdentityUser kelas.
Anda perlu untuk memanggil OnModelCreating metode dari kelas dasar terlebih dahulu, dan setelah itu tambahkan kode anda. Jadi Anda metode OnModelCreating harus terlihat seperti ini:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
Saya mencoba cara yang sederhana.. copy string koneksi dari db dan mengganti string koneksi DefaultConnection. Pergi ke depan dan membuat pengguna, semua yang diperlukan tabel yang secara otomatis dibuat dalam database anda.
Harapan yang membantu