2017-02-28 1 views
2

Ich verwende ASP.NET Identity 2.0. Derzeit würde Ich mag ApplicationUser (umbenannt AspNetUsers-Users) von TabelleApplicationWise erweitern, um die Beziehung zwischen freigegebenen Projekten korrekt festzulegen

erweitern UserDetails wie FirstName usw. Was ist mein Problem? Ich habe Klassenbibliothek Projekt getrennt, die EF-Modell speichert. Ich mag es nicht, ein anderes EF-Modell zu generieren (wenn es nicht notwendig ist).

Ich habe in SQL Server-Beziehung zwischen Benutzer Tabelle und UserDetails Tabelle, das ist alles in Ordnung. Leider ist in ASP-Projekt Benutzer Tabelle tief in IdentityUser fest programmiert. Das heißt, ich habe ApplicationUser, die IdentityUser erbt.

Was ich versuche, ist in AppDbContext:

protected override void OnModelCreating(ModelBuilder builder) 
{ 
    base.OnModelCreating(builder); 

    // Ignore columns 
    builder.Entity<ApplicationUser>().Ignore(c => c.PhoneNumberConfirmed); 

    // Rename tables 
    builder.Entity<ApplicationUser>().ToTable("Users"); 
    builder.Entity<IdentityRole>().ToTable("Roles"); 
    builder.Entity<IdentityRoleClaim<string>>().ToTable("IdentityRoleClaims"); 
    builder.Entity<IdentityUserClaim<string>>().ToTable("IdentityUserClaims"); 
    builder.Entity<IdentityUserLogin<string>>().ToTable("IdentityUserLogins"); 
    builder.Entity<IdentityUserToken<string>>().ToTable("IdentityUserTokens"); 

    // Relationship 
    builder.Entity<ApplicationUser>() 
     .HasOne(p => p.UserDetails) 
     .WithOne(i => i.Users) 
     .HasForeignKey<Shared.Database.UserDetails>(u => u.UserID); 
} 

Problem auf letzte Zeile ist in WithOne(i => i.Users), i.Users nicht ApplicationUser ist. Lustige Sache ist, dass ApplicationUser gleiche Eigenschaften wie hat: D

So muss ich nur wissen, wie man es richtig konvertiert, um Beziehung zu bilden.

Irgendwelche Ideen, um das zu lösen? Oder irgendwelche Ratschläge, wie man es anders machen könnte?

Gemeinsames Projekt wird durch ein weiteres Projekt (WCF) verwendet, so kann ich es nicht aus IdentityUser vererben setzen:/

Danke Jungs.

Antwort

2

So wie ich es verstehe, möchten Sie zwei verschiedene Objekte zu ein und derselben Datenbanktabelle zuordnen und auch eine andere Entität FK dieser Tabelle zuordnen. Adn Sie kein Problem mit dem ersten Teil, aber habe Probleme mit dem zweiten:

Problem ist auf letzte Zeile in WithOne(i => i.Users), i.Users ist nicht ApplicationUser. Komische ist, dass ApplicationUser hat die gleichen Eigenschaften wie i.Users: D

Ich sehe zwei Lösungen.

  1. die Navigationseigenschaft von der UserDetails Klasse entfernen und verwenden Sie einfach an beiden Orten WithOne().
  2. Im Fall, dass Sie die Navigationseigenschaft, Sie Ansatz ähnlich der Identität Klassenstruktur wie folgt verwenden:

Lassen Sie sagen, die UserDetails Klasse, die Sie zur Zeit wie folgt aussieht in dem gemeinsamen Projekt haben:

public class UserDetails 
{ 
    public string Id { get; set; } 
    public string FirstName { get; set; } 
    // other properties ... 
    public string UserID { get; set; } 
    public User User { get; set; } // the problematic navigation property 
} 

Sie können es auf eine generische Klasse konvertieren:

public class UserDetails<TUser> where TUser: class 
{ 
    public string Id { get; set; } 
    public string FirstName { get; set; } 
    // other properties ... 
    public string UserId { get; set; } 
    public TUser User { get; set; } 
} 

und lassen Sie die alte, nicht generische Klasse einfach erben davon:

public class UserDetails : UserDetails<User> { } 

Jetzt ist alles in dem gemeinsamen Projekt EF Modell wie zuvor sein soll, so dass die andere (WCF) Projekt, um es verwenden, sollte nicht beeinträchtigt werden.

Ich denke, Sie bekommen schon den Punkt. In ASP-Projekt würden Sie erzeuge einfach eine neue Klasse:

public class ApplicationUserDetails : UserDetails<ApplicationUser> { } 

und wo es sich auf die UserDetails Tabelle ähnlich wie Sie abgebildet ApplicationUser-Users:

builder.Entity<ApplicationUserDetails>().ToTable("UserDetails"); 

dann die UserDetails Navigation ändern Eigenschaft in der ApplicationUser Klasse zu:

public ApplicationUserDetails UserDetails { get; set; } 

und schließlich die Beziehung ohne irgendeinen Profi einrichten belt:

builder.Entity<ApplicationUser>() 
    .HasOne(u => u.UserDetails) 
    .WithOne(d => d.User) 
    .HasForeignKey<ApplicationUserDetails>(d => d.UserID); 
+0

Dies ist die Antwort, die ich gesucht habe, leider ist es nicht der Weg, wie es geht, weil es immer einen Fehler mit Entity-Beziehung kommen wird. Ich muss es komplett neu gestalten. Jedenfalls danke :) – user1085907

+0

Sie sind willkommen, froh, dass es geholfen hat. Obwohl ich wünschte, es wäre eine echte Lösung für das Problem, nicht sicher, was die Auswirkungen mit Ihrem realen Fall sind, aber ich nehme an, Sie wissen es besser :) –

+0

Gut ist die Sache, dass asp.net Kern nicht unterstützen ado.net bei es funktioniert nicht wirklich gut mit grundlegenden Entity Framework, wie ich dachte. Meine nächsten Schritte sind also das Erstellen eines Datenbankmodells basierend auf dem Entity Framework Core, das diese Probleme lösen soll :) – user1085907

Verwandte Themen