C#

Alles rund ums Thema C#

ASP.NET: Eigenen RoleProvider schreiben

0

Da ich nun einen eigenen MembershipProvider nutze, möchte ich auch entsprechenden meinen RoleProvider anpassen.
Dies ist eigentlich ähnlich einfach, wie der MembershipProvider. Dazu wird eine eigene Klasse von System.Web.Security.RoleProvider abgeleitet. Auch könnt ihr hier wieder mit dem Überschreiben der Methode “Initialize()” Werte aus der “web.config” übergeben. Wo ihr die Daten ablegt, bleibt euch auch hier wieder überlassen.

Das Einbinden in die “web.config” erfolgt über folgenden Eintrag:

    <roleManager enabled="true" defaultProvider="MyPersonalRoleProvider">
      <providers>
        <clear />
        <add name="MyPersonalRoleProvider" type="MyApp.PersonalRoleProvider" connectionStringName="MSPConnString" />
      </providers>
   </roleManager>

Wichtig ist die erste Zeile. Standardmäßig steht “enabled” nämlich auf false!
Der RoleProvider ist nun fertig zum Einsatz! In eurem ASP.NET Projekt könnt ihr auf die Daten über die Standardmethoden wie etwa “Role.IsUserInRole()” etc. zugreifen. Mehr dazu steht in der MSDN.

ASP.NET: Eigenen MembershipProvider schreiben

1

Manchmal kann es Sinn machen, nicht den standardmäßigen ASP.NET MembershipProvider zu nutzen. Daher möchte ich euch kurz erklären, wie ihr einen eigenen MembershipProvider schreiben könnt. Dabei ist es letztendlich euch überlassen, wo die Daten gespeichert sind.

Ich benutze bei einem Projekt etwa eine SQL-Datenbank und speicher bzw. lese die Daten per Stored-Procedures. Man könnte die Daten aber auch in einer XML-Datei speichern oder direkt hardcoded in der Klasse.
(weiterlesen …)

Linq to Entity – Many to Many Relationship Problem

5

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.

Boolschen Rückgabewert einer Stored Procedures in C#

1

Ich hatte mir eine Stored Procedure erstellt, welche überprüft, ob es schon einen bestimmten Eintrag in der Datenbank gibt. Sie sollte mir also nur ein true oder false zurück liefern.

ALTER PROCEDURE dbo.LineExists
	(
	@name nvarchar(100)
	)
AS BEGIN
	IF(EXISTS(Select [Name] FROM DemoTable WHERE [Name] = @name))
		RETURN(1)
	ELSE
		RETURN(0)
END

Meine passende C# Funktion sah in etwa so aus:

SqlConnection sqlConn = new SqlConnection(this.connstring);
SqlCommand sqlCom = new SqlCommand("LineExists", sqlConn);
sqlCom.CommandType = CommandType.StoredProcedure;
sqlCom.Parameters.Add("@name", SqlDbType.NVarChar).Value = "TestLeine";

sqlConn.Open();
bool vorhanden = ((int)sqlCom.ExecuteScalar() == 1) ? true:false;

Das führte immer zu einer Null-Reference-Exception. Auch der Weg über einen SqlDataReader funktionierte nicht. Eine Möglichkeit wäre, die Stored Procedure anzupassen und statt “Return(0)” “Select 0″ zurück zu geben. Dann würde der obere Code auf jeden Fall funktionieren.

Andere Möglichkeit wäre, den Return Value auszulesen. Dazu muss man dem SqlCommand einen Parameter mitgeben, welchen ihr nach der SQL Operation wieder auslest. Kurzes Code-Beispiel:

SqlConnection sqlConn = new SqlConnection(this.connstring);
SqlCommand sqlCom = new SqlCommand("LineExists", sqlConn);
sqlCom.CommandType = CommandType.StoredProcedure;
sqlCom.Parameters.Add("@name", SqlDbType.NVarChar).Value = "TestLeine";
sqlCom.Parameters.Add("RETURN_VALUE", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;

sqlConn.Open();
sqlCom.ExecuteNonQuery();
bool vorhanden = ((int)sqlCom.Parameters["RETURN_VALUE"].Value == 1) ? true:false;

Beide liefern das selbe Ergebnis. Pro oder Contra habe ich bei einer spontanen Google-Recherche nicht gefunden, ist sicherlich Geschmackssache.

ADO.NET: Feld ausschließen

0

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.

nach oben