Laden...

Fluent-Nhibernate: Child-Entity wird nach dem dem zweiten Mal hinzufügen nicht mehr geladen

Erstellt von b0b0nr1 vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.481 Views
B
b0b0nr1 Themenstarter:in
92 Beiträge seit 2011
vor 7 Jahren
Fluent-Nhibernate: Child-Entity wird nach dem dem zweiten Mal hinzufügen nicht mehr geladen

verwendetes Datenbanksystem: MMSQL 2014

Hallo!

Ich hoffe das ist richtige Forum.

Ich verwende Fluent NHibernate.

Meine Users Entity hat beinhaltet eine TwitchProfile Entity.
Wenn ich die Entity wie folgt hinzufüge (nach erfolgter Authentification) wird die Entity wie gewollt im Profil geladen.


TwitchProfile TwitchAccount = new DB.Domain.Entities.TwitchProfile()
                    {
                        User = this.UserSession.User,
                        ChannelName = twitchChannel.name,
                        ChannelUrl = new Uri(twitchChannel.url),
                        ChatUrl = new Uri("http://www.twitch.tv/"+ twitchChannel.name +"/chat"),
                        OAuthToken = authorizeResponse.access_token,
                        ProfileUrl = new Uri("https://www.twitch.tv/"+twitchUser.name+"/profile"),
                        Scopes = String.Join(" ", authorizeResponse.scope),
                        StreamName = twitchChannel.status,
                        StreamUrl = new Uri("http://player.twitch.tv/?channel="+ twitchChannel.name),
                        TwitchID = twitchUser._id,
                        TwitchName = twitchUser.name,
                        IsLive = isOnline,
                        PreviewImage = _previewImage,
                        Game = g,
                        EmbedMode = DB.Domain.Enums.TwitchProfileSettings.TwitchProfileEmbedModeEnum.embed,
                        ShowChat = true 



                    };
                    var u = this._service.GetById(this.UserSession.User.Id);
                    if(u.TwitchAccount == null)
                        this._twitchService.Create(TwitchAccount);

Nun hat der User die Möglichkeit seinen Twichaccount natürlich auch wieder vom Profil zu entfernen. Löschen tue ich diesen wie folgt:


var u = this.UserSession.User;

        if (u.TwitchAccount != null)
        {
            var p = u.TwitchAccount;

            this._twitchService.Delete(p.Id);





        }

        return null;

Klappt alles wie gewollt. Profil entfernt. Jedoch führe ich es erneut aus und Füge es wie oben hinzu, wird der Datensatz zwar in die Tabelle TwitchProfile geschrieben mit richtigen Foreign Key, aber die Users Entity in Nhibernate sagt trotzdem Users.TwitchAccount == null.

Komischerweise klappt es in den Unit Tests. Ich benutzt MVC5 und mit einer UnitOfWork die beim start einer Action die Transaction beginnt und beim Ende diese Commitet und die Session schließt.

Der einzige Unterschied zwischen dem UnitTest und dem Controller Aufruf ist, dass im UnitTest die Session nicht geschlossen wird sondern die Transaction zwischen den einzelnen Schritten Comitted wird.

Auch wenn ich die Tabelle händisch leere wird die Entity nicht geladen wenn ich sie hinzufüge.

Lösche ich die Tabelle jedoch wird die Entity nach Hinzufügen wieder angezeigt und nach dem Löschen des Eintrags erfolgt wieder das gleiche Resultat.

Meine Mappings sind wie folgt:

Users


public class UsersOverrides : IAutoMappingOverride<Users>
{
    public void Override(AutoMapping<Users> mapping)
    {

        mapping.References(m => m.Role).ForeignKey("Role_Id").Cascade.None();
        mapping.HasMany(m => m.ProfileData).KeyColumn("User_Id").Cascade.All();

        mapping.HasOne(x => x.Avatar).Cascade.All();

        mapping.HasOne(x => x.TeamAccount).Cascade.All();


        mapping.HasMany(x => x.Sessions).Cascade.All();


        mapping.HasMany(x => x.Conversations).Cascade.All();

        mapping.HasMany(x => x.Relations).Cascade.All();

        mapping.HasMany(x => x.Ignores).Cascade.All();

        mapping.HasMany(x => x.Threads).Cascade.None();
        mapping.HasMany(x => x.Posts).Cascade.None();

        mapping.HasMany(x => x.GameProfiles).Cascade.All();

        mapping.HasOne(x => x.Steamprofile).Cascade.All();

        mapping.HasOne(x => x.TwitchAccount).Cascade.Delete();
    }
}

TwitchProfile


public class TwitchProfileOverrides : IAutoMappingOverride<TwitchProfile>{
    public void Override(AutoMapping<TwitchProfile> mapping)
    {

        mapping.References(x => x.Game).Cascade.None(); 
        mapping.References(x => x.User).Cascade.Persist();
    }
}

Ich kämpfe mit dem Problem jetzt seit Wochen und komme dabei auf keinem grünen Zweig.

Ich hoffe mir kann da wer helfen 😃

Best,

b0b0