Soru ASP.Net MVC 5 kimliğine yabancı anahtar başvuru nasıl eklenir?


ASP.Net Identity kullanarak yeni bir ASP.NET MVC 5.1 projem var. Güvenilir ve umut verici görünüyor, ancak bugün SQL kullanıyorsanız basit bir şeyler yapmak için neredeyse 9 saat harcıyorum.

Sorunum, varsayılan AspNetUsers tablosuna yabancı anahtar başvurusu ile CodeFirst aracılığıyla bir tablo oluşturamıyorum.

Örneğin: Adlı bir tablo oluşturdum - Adres

   public class Address
    {
        [Key]
        public string UserId { get; set; }
        public string MyAddress { get; set; }
    }

Ama nasıl bir yabancı anahtar referansı oluşturabilirim? AspNetUsers?

Yukarıdaki özelliği yukarıda değiştirmeyi deneyin.

public IdentityUser MyAddress { get; set; }
// Or
public virtual IdentityUser MyAddress { get; set; }
// Or
public virtual ApplicationUser MyAddress { get; set; }

Ama hepsi hala hata gösteriyor:

One or more validation errors were detected during model generation:

MiaPos.Models.IdentityUserLogin: : EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType. 
MiaPos.Models.IdentityUserRole: : EntityType 'IdentityUserRole' has no key defined. Define the key for this EntityType. 
IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' is based on type 'IdentityUserLogin' that has no keys defined. 
IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' is based on type 'IdentityUserRole' that has no keys defined.

Ayrıca, geçersiz kılmayı da deniyorum OnModelCreating bundan posta 

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
    modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
    modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
}

Ama koştuğumda Add-Göç, IdentityUserLogin, IdentityRole, IdentityUserRole tablolarını oluşturur ve çoğaltır, yalnızca önek farklıdır. (Aspnet <-> Kimlik)

Sonunda 10 saniye içinde SQL ile yapıyorum ama sadece CodeFirst'te neden yapamayacağımı bilmek istiyorum? Ve neden böyle şeyler yapmak çok zor Microsoft 2014 Yeni Teknoloji.

enter image description here


32
2018-03-10 10:04


Menşei


Bunu kontrol edebilirsiniz: github.com/rustd/AspnetIdentitySample - Gábor Plesz
Teşekkürler Gábor Plesz, bu ASAP'ı kontrol edeceğim. - Cheung
Merhaba Gábor Plesz, ben sadece örneği kontrol ediyorum. Cevabı buldum. Bu yüzden soruma cevap veriyorum. - Cheung
Sadece benzer bir soruyu yanıtladım, eğer yardımcı olursa: stackoverflow.com/questions/20104289/... - EluciusFTW


Cevaplar:


Bunu yapabilirsin. çünkü bazen 1-1'e ihtiyacınız olabilir

 public class AnotherTable
    {
        [Key]
        public string UserId { get; set; }

        [ForeignKey("UserId")]
        public virtual ApplicationUser User { get; set; }
    }

28
2017-09-26 06:21



Bu doğru cevap olmalı! 1-1 değilse, hem bir DiğerTable ID hem de ApplicationUser ID'yi içeren üçüncü bir tablo oluşturursunuz. - Zakos
Fluent API ve 1-çok tarafından bu nasıl elde edilir? - MichaelMao
@MichaelMao Sadece tarafından kongre. Çocuk sınıfınızın yabancı anahtar dizgisi özelliğini 'ApplicationUserId' olarak adlandırın, bu kongre ile yabancı anahtar olacaktır. EntityName + Id. Aynı anahtar birincil anahtar için geçerlidir. 'Id' her zaman birincil anahtar olacaktır. - Pascal


Teşekkürler Gábor Plesz Yukarıdaki yorum için.

Çözümü buldum.

Devralınan ApplicationUser sınıfı IdentityUser (AspNetUsers tablosunu yaratan), alt sınıfın (alt tablo) bir ICollection özelliği oluşturmalıdır.

Örneğin.

public virtual ICollection<ToDo> ToDoes { get; set; }

Böylece Yapmak sınıf referans olabilir ApplicationUser 

Örnek olarak bir göz atmanızı öneririz. Gábor Plesz dedim.

enter image description here


24
2018-03-10 15:10



Teşekkürler çok çözüm var - Cherry
Lütfen başkalarına yardım etmek için cevabınızı doğru cevap olarak işaretleyin - Simua
Varlıklarım başka bir sınıf kütüphanesi projesinde ve Kimlik tabloları web projesinde bulunuyorsa, yabancı anahtar ilişkisi nasıl eklenir? Herhangi bir fikrin varsa lütfen bana bildirin. - Steve


AspNetUsers tablosuna sütun olarak oluşturulan Adres adında bir özellik oluşturmak yerine Adres adında bir tablo oluşturmak istiyorsanız aşağıdakileri yapın (obs: bu durumda, kullanıcının bir çok adrese sahip olabileceğini varsayıyorum):

  1. Adres sınıfınızda:

    public class Address
    {
        public string MyAddress { get; set; }
    
        // referencing the AspNetUsers table ( ApplicationUser.cs)
        public string UserId { get; set; }
        public virtual ApplicationUser User { get; set; }
    }
    
  2. ApplicationUser Sınıfınız:

    public virtual ICollection<Address> Addresses { get; set; }
    
  3. OnModelCreating yöntemindeki DBContext'inizde aşağıdakileri yapın (akıcı API):

    builder.Entity<Address>()
                  .HasOne(c => c.User)
                  .WithMany(x => x.Addresses)
                  .HasForeignKey(f => f.UserId)
                  .HasConstraintName("UserId")
                  .OnDelete(DeleteBehavior.Cascade)
                  .IsRequired();
    

OBS: OnModelCreating yönteminin üzerinde bu kod satırını eklemeyi unutmayın:

public DbSet<Address> Addresses { get; set; }

Paket Yöneticisi Konsolunuzda bu komutları çalıştırdıktan sonra:

Add-Migrations UserAddress

ve sonra:

Update-Database. 

Ancak, sadece AspNet Kullanıcılarına yeni bir özellik eklemek istiyorsanız, ApplicationUser.cs dosyasında / sınıfında bu özelliği oluşturun:

public class ApplicationUser : IdentityUser
    {
        public string Address { get; set; }
    }

ve PMC'niz için aynı komutları çalıştırın:

Add-Migration UserAddress

sonra:

Update-Database

Bu yardımcı olur umarım!


0
2017-08-23 05:44