Linq to Entity – Many to Many Relationship Problem

Aktuell habe ich folgendes Problem.
Ich habe eine Tabelle Rollen und eine Tabelle Benutzer, beide stehen über eine dritte Tabelle in einer m:m-Beziehung. Per Linq-to-Entity, also über ein ADO.NET Modell hole ich mir die Daten. Jedoch kann ich keine Relationen speichern.
Aktuell bekomme ich die Fehlermeldung:

EntitySet 'UserInRole' kann nicht aktualisiert werden, denn es hat eine DefiningQuery, und im <ModificationFunctionMapping>-Element ist kein <InsertFunction>-Element zur Unterstützung des aktuellen Vorgangs vorhanden.

Eine Suche im Netz bring mich nicht wirklich weiter. Dort hieß es, ich soll für die m:m-Tabelle einen Primary-Key setzen. Habe ich über beide Felder getan, Ergebnis war das selbe.
Bei dem Beispiel kann ich es über den Role-Provider lösen, aber so richtig weiter bringt es mich dann an anderer Stelle nicht.
Ich werde weiter berichten.

ADO.NET: Feld ausschließen

Als ich den letzten Beitrag schrieb, viel mir ja ein, dass man nicht immer alle Spalten an das Modell übergeben möchte. Oder das es nur Readonly oder ähnliches ist.
Im Prinzip ist es auch einfach, wenn man weiß wie es geht. Der Designer in Visual Studio ist da meiner Meinung etwas umständlich in der Handhabung.
So möchte ich bei meinem letzten Modell die ID auf Readonly setzen, da dies in der Datenbank automatisch hochgezählt wird. Die ID daher manuell zu setzen würde keinen Sinn ergeben.
ADO.NET Modell

Dazu öffne ich das Modell im Visual Studio Designer und wähle oben die Tabelle aus. Unten wird mir nun das Fenster „Zuordnungsdetails“ angezeigt (alternativ über Ansicht » Weitere Fenster). Hier wähle ich die Spalte durch anklicken aus, die ich bearbeiten möchte. Wichtig ist jetzt dass ich hier nicht das vordere MSSQL-Feld sondern den hinteren Bereich, also den C# Typen auswähle (siehe Markierung).
ADO.NET Feld bearbeiten

Im Eigenschaftsfenster könnt ihr nun die entsprechenden Werte ändern. In dem Fall setzen wir den Setter auf Private.
Eigenschaften

Wenn wir nun versuchen eine Id zu setzen, hagelt es Fehlermeldungen:

TestTable test = new TestTable();
test.Id = 3;

Fehlermeldung lautet:

Die Eigenschaft oder der Indexer "MvcApplication1.Models.TestTable.Id" kann in diesem Kontext nicht verwendet werden, da der set-Accessor nicht verfügbar ist.

Auf diesen Weg können wir auch noch andere Sachen ändern, z.B. den Getter verändern oder den Namen des Attributs ändern.

Ach sollte man ein Feld gar nicht im Modell haben wollen, so wählt man bei den Zuordnungdetails einfach „Löschen“ aus.
ADO.NET Feld löschen

Auf den Weg könnt ihr das Feld später auch wieder ins Modell reinholen.

ADO.NET: Datenbankstruktur aktualisieren

Angenommen ihr habt eine Tabelle, auf die ihr mit dem ADO.NET Provider zugreift. Ihr habt ihn schön konfiguriert und nutzt ihn auch schon produktiv. Dieses Model könnte in etwa so aussehen:

ADO.NET Model

Auch wenn man sich vorher Gedanken gemacht hat, kann es sein, dass sich die Struktur der Datenbank ändert. Ein neues Feld muss hinzugefügt werden als Beispiel. Wie in meinem Beispiel.
Datenbankänderung

Nun möchte ich diese Änderungen natürlich auch möglichst einfach in mein Model bekommen, ohne dies neu anzulegen. Öffnet das Model in Visual Studio per Doppelklick, so dass ihr in den Designer kommt. Rechtsklickt dort irgendwo und wählt „Modell aus Datenbank aktualisieren“.
ADO.NET Modell aktualisieren

Wählt im folgenden Bildschirm den Reiter „Aktualisieren“. Hierbei sei erwähnt, dass nun alles aus der Datenbank aktualisiert wird! Also solltet ihr euch die Änderungen dann noch mal ansehen.
ADO.NET Aktualisieren

Zu guter letzt habt ihr nun das neue Feld in eurem Ado.Net Modell.
adonet5

ADO.NET Foreign Key = null selektieren

Ich habe zwei Tabellen erstellt, welche über einen Foreign Key miteinander verknüpft sind.
Nun habe ich über den Wizard ein „ADO.NET Entity Data Model“ erstellt und die beiden Tabellen ausgewählt. Richtig hat er die Relation zwischen Tabelle A und Tabelle B mit 0..1 –> * erkannt.

Nun wollte ich alle Einträge aus Tabelle B, welche keine Verknüpfung zu Tabelle A haben, sprich in der Spalte den Wert „NULL“ besitzen.
Leider ist es nicht möglich, die Spalte im Code anzusteuern.
Foreignkey1

Die Lösung ist hier eigentlich ganz einfach, meine erste Idee war auch richtig, hat aber nicht „geklappt“, da ich mir die falsche Variable ausgeben lassen habe.
Da durch die 0..1 –> * Beziehung im „AdressbuchUser“-Objekt automatisch ein (in dem Fall) „AdressbuchFirmen“-Objekt angelegt wird, welches die Daten aus der anderen Tabelle enthält, braucht man dies nur auf null zu prüfen, schon funktioniert die ganze Geschichte.

Foreignkey2

Weitere Informationen zu dem Thema findet ihr hier.