Warum dies verstößt gegen die Einschränkung der Typparameter 'TUser'?
Ich versuche mich anzupassen asp.net Identität von Entitäten mit den folgenden:
public class User : IdentityUser<string, UserClaim, UserRole, UserLogin>
public class UserClaim : IdentityUserClaim<string>
public class UserLogin : IdentityUserLogin<string>
public class UserRole : IdentityUserRole<string>
public class UserToken : IdentityUserToken<string>
public class Role : IdentityRole<string, UserRole, RoleClaim>
public class RoleClaim : IdentityRoleClaim<string>
Habe ich dann erstellt eine DbContext-Klasse wie folgt
public class AppDbContext : IdentityDbContext<User, Role, string, UserClaim, UserRole, UserLogin, RoleClaim, UserToken>
Dann konfigurieren Sie diese mit
services
.AddIdentity<User, Role>()
.AddEntityFrameworkStores<AppDbContext>()
.AddDefaultTokenProviders();
aber ich habe versucht auch mit
.AddEntityFrameworkStores<AppDbContext, string>()
Ich habe gelesen, dass viele blog-posts im internet, wie diese zum Beispiel, aber die meisten von Ihnen befassen müssen, gegen eine änderung des Datentyps für die Tasten, wie zu int
oder Guid
. In meinem Fall bin ich nicht die änderung der Standard-Schlüssel Datentyp aus string
.
Ich allen diesen Fällen das kompilieren ist ok, aber es wirft beim ausführen einen Fehler
System.TypeLoadException
GenericArguments[0],'MyIdentity.Personen.Benutzer", auf
'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`8[TUser,TRole,TContext,TKey,TUserClaim,TUserRole,TUserLogin,TUserToken]'
gegen die Einschränkung der Typparameter 'TUser'.System.RuntimeTypeHandle.Instanziieren(RuntimeTypeHandle Griff,
IntPtr* pInst, int numGenericArgs, ObjectHandleOnStack-Typ) bei
System.RuntimeTypeHandle.Instanziieren(Typ[] inst) bei
System.RuntimeType.MakeGenericType(Typ[] Instanziierung)
Wenn ich eine angepasste UserStore
Klasse wie erklärt dieser Beitrag
public class UserStore : UserStore<User, Role, AppDbContext, string, UserClaim, UserRole, UserLogin, UserToken>
Einen compile-Fehler angezeigt, die besagt, dass
CS0311 Dem Typ " MyIdentity.Personen.Rolle' kann nicht als Typ
parameter 'Oberleitungs' im generischen Typ oder Methode "UserStore'. Es gibt keine implizite Konvertierung von Referenz
'MyIdentity.Personen.Rolle' zu
'Microsoft.AspNetCore.Identität.EntityFrameworkCore.IdentityRole>'
Was mache ich falsch?
- Hat Ihr
User
Klasse ein default-Konstruktor? - Ja. Ich habe gerade überprüft.
public User() : base()
Du musst angemeldet sein, um einen Kommentar abzugeben.
UserStore<TUser>
istTUser : IdentityUser
.IdentityUser : IdentityUser<string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>
.User : IdentityUser<string, UserClaim, UserRole, UserLogin>
.Lange Namen machen es einfach zu verpassen, also lasst alias
IdentityUser
alsD
undIdentityUser<string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>
alsB
. Nun, die oben formuliert werden kann:TUser : D
(aTUser
muss eine ArtD
)D : B
(D
ist eine ArtB
)User : B
(IhrUser
ist eine ArtB
im Allgemeinen aber nicht eine ArtD
speziell wie erforderlich)Stand ich vor diesem Problem, fand ich dies: "Wenn Sie anpassen ASP.NET Kern-Identität, sollten Sie nicht verwenden AddEntityFrameworkStores mehr."
Sie implementieren sollten Ihre:
Und Dann umleiten von integrierten Dienstleistungen, um Ihre benutzerdefinierten Diensten (Start -.cs):
Dann stellen Sie Ihre benutzerdefinierte Dienste:
Das problem ist hier
RoleClaim
muss vom TypIdentityRoleClaim<TKey>
statt
TRoleClaim
Es wird berichtet, hier als bug.