Laden...

[erledigt] Entity Framework Referenz auf FK gibt null zurück

15 Antworten
2,143 Aufrufe
Letzter Beitrag: vor 13 Jahren
[erledigt] Entity Framework Referenz auf FK gibt null zurück

verwendetes Datenbanksystem: <SQL Server: 2005 - .NET Framework 3.5>

Hi,

Ich habe hier ein EntityObject (UserInAffiliate).
Nun würde ich gerne den Namen der zugehörigen Region auslesen -> Die Tabelle Regions ist als FK markiert & mit einer ID identifiziert.

        foreach (UserInAffiliates usr in lUser)
        {
            TableRow TrUser = new TableRow();
            TableCell TdUserId = new TableCell() { Text = usr.FK_UserId };
            TableCell TdRoleId = new TableCell() { Text = usr.FK_Roles.Name };

            TrUser.Cells.AddRange(new TableCell[] {TdUserId, TdRoleId});
            TblUsers.Rows.Add(TrUser);
        }

Das Ganze schlägt dann jedoch fehlt, weil FK_Roles null ist.
Warum?
Einträge sind vorhanden.

Der benötigte Teil des Modells habe ich euch angehängt.

Gruess,
Regenwurm

ServiceStack & Angular = =)

Hallo Regenwurm,

meinst Du vielleicht Role statt Region?
Wenn usr.FK_Roles null ist, ist dann usr.FK_UserId auch null?
Wie mir scheint, ist lUser schon nicht richtig befüllt.

Gruß
Mango

Hi,

Sorry - Role stimmt natürlich (FK_Roles genauert gesagt).
Nein FK_UserId ist ausgefüllt (Liegt aber wohl daran, dass dies keine Referenz ist - sondern das Attribut in der Tabelle selber existiert).

ServiceStack & Angular = =)

Also,
Du müsstest mal posten, wie lUser vorher befüllt wird. Da muss irgendwo der Haken sein.

Mango

        public IQueryable<UserInAffiliates> LoadAllAffiliateUsers_AffiliateFiltered(int AffiliatedId)
        {
            var ctx = RPDEntities.Context;
            return ctx.UserInAffiliates.Where(usr => usr.FK_AffiliateId == AffiliatedId);
        }

ServiceStack & Angular = =)

Das Ganze schlägt dann jedoch fehlt, weil FK_Roles null ist.

Warum ist dies null. Ein User hat eine Rolle, nicht? Dann mach per Datenbank so dass ein User eine Rolle haben MUSS, dann ist FK_Roles nie null.

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

Hätte ich auch gesagt, aber im Primary Key ist null eh nicht erlaubt.

Hallo Regenwurm schau Dir mal

Loading Related Objects (link korrigiert

an, und schau ob Dir weiter hilft.

Evtl schlage ich dir vor dass du eine IDENTITY als PK machst und nicht eine Konsellation von 3 Spalten. Ich bin kein Freund von kombinierten ID, da sie grundsätzlich schwerer zu warten sind. Auch die SELECT Abfragen werden unnötig kompliziert. In deinem Beispiel gehts noch, aber denk dir mal den Fall aus wenn eine Tabelle (FOO) eine Referenz von UserInAffiliates hat. Dann muss diese Tabelle alle 3 PK von UserInAffiliates als FK speichern. Und so weiter.

Ich würde vorschlagen du machst eine IDENTITY und erstellst einen UNIQUE KEY auf den 3 Spalten.

@unconnected, bitte repariere deinen Link

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

Das Ganze schlägt dann jedoch fehlt, weil FK_Roles null ist.
Warum ist dies null. Ein User hat eine Rolle, nicht? Dann mach per Datenbank so dass ein User eine Rolle haben MUSS, dann ist FK_Roles nie null.

Gruß
Michael

Hi,
In den Tabellen ist null nicht erlaubt - es sollte also immer eine Zuweisung geben.

Ich habe im Entity Model mal die Relation der 2 Tabellen Roles & UserInAffiliates geöffnet (Anhang).
Sieht so aus als ob er zwar die referenz zwischen den Tabellen kennt, aber nicht weiss auf welche Attribute er schauen soll.

Ich habe nun unter Principal Key den FK_RoleId mit RoleId zu verknüpfen versucht.
Erhalte dann jedoch den Error

Error 111: Properties referred by the Principal Role rpdlic_UserAffiliatesRoles must be exactly identical to the key of the EntityType T_IS.RPDLicenseManager.UserInAffiliates referred to by the Principal Role in the relationship constraint for Relationship T_IS.RPDLicenseManager.FK_rpdlic_UserAffiliates_rpdlic_Roles. Make sure all the key properties are specified in the Principal Role.

Was will mir diese Fehlermeldung genau mitteilen?

@unconnected
Danke für den Link - aber so wie es aussieht ist dies für .NET 4.0 (Ich benutze hier .NET 3.5).

Gruss,
Regenwurm

ServiceStack & Angular = =)

Im 3.5 hat das Entity Framework imho noch kein Lazy Loading...

Wenn Du also schreibst


return ctx.UserInAffiliates.Where(usr => usr.FK_AffiliateId == AffiliatedId).Include("FK_Roles")

sollte es auch gefüllt sein..

Hi unconnected,

Ein 'Include' gibt es leider nicht.
Meinst du ich könnte sonst mit Join etwas rumwerkeln?

Gruss

ServiceStack & Angular = =)

Du hast recht das Include gehört vor das Where...


ctx.UserInAffiliates.Include("FK_Roles").Where(usr => usr.FK_AffiliateId == AffiliatedId);

sorry Flüchtigkeitsfehler. Da müsste es dann das Include aber geben 😃

Interessiert mich ja nun doch, hats geklappt?

Hi unconnected,

Sorry für die spätere Antwort - war gestern leider nicht im Büro.
Das Ganze funktioniert mit dem Include!! 😃
Ich erhalte nun eine Referenz auf den Eintrag in der Rollen-Tabelle.

Besten Dank!

Gruess,
Regenwurm

ServiceStack & Angular = =)