Ich habe sehr viel mit dieser Bibliothek zu kämpfen, die ich macht die Frage, warum dies die empfohlene Bibliothek für die Verwendung von OWIN mit NHibernate ist.
Wie auch immer, Ihre Frage zu beantworten, können Sie den Code zur Verfügung gestellt, dass Sie von der Github Website bekam fügt NHibernate Zuordnungen für die Klassen der Bibliothek. NHibernate hat keine Zuordnung für ApplicationUser
, es hat nur eine Zuordnung für seine Basisklasse. NHibernate benötigt eine Zuordnung für die instanziierte Klasse. Dies ist problematisch, weil Sie in der Bibliothek der Montage keinen Zugriff auf den Mapping-Code haben, so können Sie es nicht stattdessen die ApplicationUser
Klasse zu verwenden, ändern. So ist die einzige Art und Weise daran vorbei, mit der Bibliothek, wie es ist, ist es, die ApplicationUser
Klasse zu entfernen und die Bibliothek der IdentityUser
Klasse. Oder Sie können den Mapping-Code von Github kopieren und versuchen, dasselbe Mapping für ApplicationUser
zu verwenden.
Auch die Bibliothek Code und der Code, den er für die AccountController
gibt nicht immer eine NHibernate Transaktion öffnen, so dass, obwohl die Bibliothek rufen Session.Save
und Session.Update
die Daten nicht letztlich in der Datenbank gespeichert werden. Nachdem Sie die Sitzung öffnen müssen Sie eine Transaktion öffnen und sie als privates Feld für die Klasse sparen:
transaction = session.BeginTransaction(IsolationLevel.ReadCommitted);
Dann brauchen Sie transaction.Commit()
nach der Aktion in den AccountController
Oberflächen nennen Ausführung, so müssen Sie außer Kraft setzen OnResultExecuted
:
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
transaction.Commit();
}
Halten Sie dieses Beispiel ist stark vereinfacht, und in einer Produktionsanwendung Sie im Kopf müssen überprüft haben, Fehler in dem Sie statt Commit Rollback, wenn es Fehler gibt, und Sie müssen richtig nah an/von allem entsorgen usw.
Auch nachdem Sie diese Probleme gelöst haben, gibt es weitere Probleme mit der Bibliothek. Ich musste die Quelle von Github herunterladen, damit ich die Bibliothek ändern konnte, um sie zu verwenden. Es gibt mindestens drei weitere eklatante Fehler im Bibliothekscode:
1) In NHibernate.AspNet.Identity.Users:
public virtual async Task<TUser> FindAsync(UserLoginInfo login)
{
this.ThrowIfDisposed();
if (login == null)
throw new ArgumentNullException("login");
IdentityUser entity = await Task.FromResult(Queryable
.FirstOrDefault<IdentityUser>(
(IQueryable<IdentityUser>)Queryable.Select<IdentityUserLogin, IdentityUser>(
Queryable.Where<IdentityUserLogin>(
// This line attempts to query nhibernate for the built in asp.net
// UserLoginInfo class and then cast it to the NHibernate version IdentityUserLogin,
// which always causes a runtime error. UserLoginInfo needs to be replaced
// with IdentityUserLogin
(IQueryable<IdentityUserLogin>)this.Context.Query<UserLoginInfo>(), (Expression<Func<IdentityUserLogin, bool>>)(l => l.LoginProvider == login.LoginProvider && l.ProviderKey == login.ProviderKey)),
(Expression<Func<IdentityUserLogin, IdentityUser>>)(l => l.User))));
return entity as TUser;
}
2) In NHibernate.AspNet.Identity.DomainModel.ValueObject:
protected override IEnumerable<PropertyInfo> GetTypeSpecificSignatureProperties()
{
var invalidlyDecoratedProperties =
this.GetType().GetProperties().Where(
p => Attribute.IsDefined(p, typeof(DomainSignatureAttribute), true));
string message = "Properties were found within " + this.GetType() +
@" having the
[DomainSignature] attribute. The domain signature of a value object includes all
of the properties of the object by convention; consequently, adding [DomainSignature]
to the properties of a value object's properties is misleading and should be removed.
Alternatively, you can inherit from Entity if that fits your needs better.";
// This line is saying, 'If there are no invalidly decorated properties,
// throw an exception'..... which obviously should be the opposite,
// remove the negation (!)
if (!invalidlyDecoratedProperties.Any())
throw new InvalidOperationException(message);
return this.GetType().GetProperties();
}
3) In NHibernate.AspNet.Identity.UserStore: Aus irgendeinem Grund auf Zumindest beim Erstellen einer Benutzer-/Benutzeranmeldung über einen externen Anbieter wie Facebook wird beim Erstellen der Benutzer-/Benutzeranmeldung die Update-Methode anstelle von Hinzufügen/Erstellen aufgerufen, was dazu führt, dass NHibernate versucht, eine Entität zu aktualisieren, die nicht existiert. Vorerst, ohne genauer darauf zu schauen, habe ich in den UserStore
Update-Methoden den Code der Bibliothek so geändert, dass SaveOrUpdate
in der NHibernate-Sitzung anstelle von Update
aufgerufen wird, wodurch das Problem behoben wurde.
Ich habe nur einfache Tests mit der Bibliothek ausgeführt, die nach meinen Änderungen funktioniert haben, also gibt es keinen Hinweis darauf, wie viele andere Laufzeit-/Logikfehler in dieser Bibliothek sind. Nachdem ich diese Fehler gefunden habe, macht es mich jetzt sehr nervös, sie zu benutzen. Es scheint, dass absolut keine Tests mit einfachen Szenarien durchgeführt wurden. Seien Sie vorsichtig mit dieser Bibliothek.
Das ist eine sehr umfassende Antwort. Ich habe das ApplicationUser-Problem, das Sie oben angesprochen haben, endlich herausgefunden, aber dann habe ich begonnen, einige der oben genannten Probleme zu lösen. Ich überlege, ob Datenbank-Agnostizismus zu vermeiden, soweit die asp.net-Identität betrifft und verwenden Sie den MySQL-Connector für Entity-Framework für die Mitgliedschaft Seite der Dinge, und halten Sie sich an nHibernate für den Rest davon. Es ist keine großartige Lösung, also werde ich mich in Zukunft entscheiden. – user2025706
Ya ich am Ende warf die Bibliothek und nicht mit asp.net Identität überhaupt. Ich verwende die OWIN-Middleware für Anmeldungen über externe Anbieter und verwende dann meine eigenen Dienste für den Datenzugriff. Ich benutze keine Passwort-Authentifizierung, nur externe Login-Anbieter, so dass es in meinem Fall keinen Sinn macht, asp.net-Identität überhaupt zu verwenden. –
@wired_in Haben Sie github-Probleme bei diesen Problemen eingereicht? Ich möchte es benutzen, aber ich stoße auf die gleichen Probleme und möchte den Fortschritt verfolgen (falls es welche gibt) Danke für die Info! –