de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 martonx
martonx
Question

Menggabungkan MyDbContext dengan IdentityDbContext

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 &#39;System.Data.Entitas.ModelConfiguration.ModelValidationException&#39; 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!

52 2013-11-04T08:49:07+00:00 8
 VansFannel
VansFannel
Pertanyaan edit 16 September 2014 в 9:04
Pemrograman
asp.net-mvc
asp.net-identity
Solution / Answer
 jd4u
jd4u
4 November 2013 в 10:36
2013-11-04T10:36:52+00:00
Lebih
Sumber
Sunting
#22705978
  1. Memindahkan ApplicationUser definisi untuk anda DAL.
  2. Mewarisi MyDbContext dari IdentityDbContext<ApplicationUser> atau IdentityDbContext
  3. OnModelCreating - Memberikan asing tombol info.
  4. Lulus MyDbContext sekaligus menciptakan UserManager<ApplicationUser>
32
0
 dotnethaggis
dotnethaggis
3 Januari 2014 в 9:02
2014-01-03T21:02:40+00:00
Lebih
Sumber
Sunting
#22705979

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.

6
0
 tomRedox
tomRedox
24 Januari 2019 в 8:45
2019-01-24T08:45:11+00:00
Lebih
Sumber
Sunting
#22705985

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.

 tomRedox
tomRedox
Jawaban edit 30 Januari 2019 в 8:38
5
0
 ShadowMinhja
ShadowMinhja
9 Mei 2015 в 8:43
2015-05-09T20:43:37+00:00
Lebih
Sumber
Sunting
#22705981

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.

4
0
 Guy
Guy
17 Juni 2014 в 9:30
2014-06-17T09:30:48+00:00
Lebih
Sumber
Sunting
#22705980
  1. Setelah anda mewarisi konteks dari IdentityDbContext kesalahan yang berkaitan dengan kunci primer pada Identitas tabel (AspNetUsers dll) harus menghilang.

  2. 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)
}
  1. saya membaca di banyak tempat bahwa ketika overiding OnModelCreating, anda harus memanggil metode dasar. Tampaknya bahwa kadang-kadang anda dapat melakukannya tanpa itu.
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
         base.OnModelCreating(modelBuilder);
         //....
    }
1
0
 Arvand
Arvand
2 Januari 2017 в 8:12
2017-01-02T08:12:08+00:00
Lebih
Sumber
Sunting
#22705983

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

 Community
Community
Jawaban edit 23 Mei 2017 в 12:02
0
0
 Marcin
Marcin
11 September 2018 в 2:03
2018-09-11T14:03:56+00:00
Lebih
Sumber
Sunting
#22705984

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>();
}
0
0
 Pooran
Pooran
3 Oktober 2015 в 4:41
2015-10-03T16:41:20+00:00
Lebih
Sumber
Sunting
#22705982

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

-2
0
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Asilbek Qadamboyev
Terdaftar 1 hari yang lalu
2
Akshit Mehta
Terdaftar 4 hari yang lalu
3
me you
Terdaftar 1 minggu yang lalu
4
Никита иванов
Terdaftar 1 minggu yang lalu
5
Alex1976G_06
Terdaftar 1 minggu yang lalu
ID
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi