Dieser Artikel wurde maschinell übersetzt.

Datenpunkte

Dem Entity Framework den Zugriff auf Tabellen verweigern, ohne Proteste zu verursachen

Julie Lerman

Julie LermanEiner der ersten Vorgänge, die ich vom Datenbankbesitzer, hören Wenn Sie das Entity Framework-Befehl erstellen am Arbeitsplatz angezeigt wird: “?Habe ich den Zugriff auf Tabellen bereitstellen? ” Reagieren Sie auf diese Weise, da eine der Hauptfunktionen von Entity Framework Generation von SELECT-, Update-, INSERT- und DELETE-Befehle.

In dieser Spalte wird ich erteilen Datenbankadministratoren Einblick in wie das Entity Framework Befehle generiert und dann einführen Features, mit denen Sie den Zugriff auf die Datenbank beschränken, da diese nur mit Sichten und gespeicherten Prozeduren verwendet werden können. Und Sie können dies tun, ohne Auswirkungen auf die Anwendungscode oder alienating die Entwickler in Ihrem Team.

Erforschen die Standard-Befehl generieren

Wie funktioniert dieses Befehlsgenerierung? Zentraler Punkt von Entity Framework ist das Entity Data Model (EDM), ein konzeptionelles Modell, das eine Anwendung Domänenobjekte beschreibt. Entity Framework ermöglicht es Entwicklern, die Abfragen für das Modell statt Anliegen selbst mit den Details der Datenbank auszudrücken. Das Modell, die Entitäten und ihre Beziehungen werden im XML-Format definiert und Entwickler arbeiten mit stark typisierten Klassen basierend auf dem Modell Entitäten. Die Entity Framework Common Language Runtime verwendet das Modell von XML zusammen mit zusätzlichen Metadaten (die das Datenbankschema und die Zuordnungen aus dem Modell abgerufen, um das Datenbankschema beschreibt) überbrückt die Klassen mit der Datenbank (siehe Abbildung 1 ).

das Entity Framework Runtime Metadaten wird verwendet, um Build Datenbankbefehlen

Abbildung 1 das Entity Framework Runtime Metadaten wird verwendet, um Build Datenbankbefehlen

Zur Laufzeit mit Hilfe der ADO.NET-Anbieter datenbankspezifische, wandelt das Entity Framework Abfragen in Speicher Abfragen für das Modell besteht, z. B. T-SQL –, die dann an die Datenbank sendet. Entity Framework wandelt die Abfrageergebnisse in Objekte, die von den Entitätsklassen mit strikter Typbindung wie in Abbildung 2 definiert.

das Entity Framework führt Abfragen und Ihre Ergebnisse verarbeitet

Abbildung 2 das Entity Framework führt Abfragen und Ihre Ergebnisse verarbeitet

Wie die Benutzer mit diesen Objekten arbeiten, verwendet das Entity Framework Identitätsschlüssel, um Änderungen an Eigenschaften sowie die Beziehungen zwischen Objekten zu verfolgen. Wenn der Code die Entity Framework SaveChanges-Methode, um Änderungen in der Datenbank beibehalten aufruft, liest die Entity Framework Runtime schließlich über alle Informationen, die Sie gesammelt hat die Änderungsnachverfolgung. Für jede Entität, die geändert, hinzugefügt oder gelöscht worden ist, Entity Framework noch einmal liest das Modell und die Aktion wird des Anbieters zum Erstellen von Speicherbefehlen und führt diese dann in einer einzelnen, umkehrbarer Transaktion in der Datenbank.

Diese Beschreibung des Standardverhaltens von Entity Framework neigt dazu, Datenbankbesitzer den Raum screaming senden, aber ich möchte das Wort “ Standard ” hier hervorzuheben. Entity Framework verfügt über viele Standardverhaltensweisen, die geändert werden können.

Wie die Entity Framework Prozesse Anforderungen zum Abrufen oder Speichern von Daten ist ein solches Verhalten, die geändert werden kann. Sie sind nicht erforderlich, um die Modellerstellung Entity Framework für den Zugriff auf Ihre Datentabellen abhängt. Sie können ein Modell erstellen, die weiß nur über Sichten und gespeicherten Prozeduren der Datenbank ohne Auswirkungen auf den Anwendungscode, der das Modell verwendet. Durch die Kombination des Entity Framework gespeicherte Prozedur-Unterstützung mit seiner Unterstützung für Datenbank anzeigen, können Sie alle Datenbankinteraktion für gespeicherte Prozeduren und Sichten basieren.

Zuordnung von Entitäten zu Datenbankansichten, Tabellen keine

Einige Möglichkeiten, um ein Modell zu erstellen. Ich werde auf Modelle konzentrieren, die aus einem älteren Datenbank durch Reverse Engineering die Datenbank erstellt wurden. Visual Studio verfügt über einen Assistenten für diesen Prozess.

Benutzer können Sie im Assistenten für Datenbanktabellen, Ansichten und gespeicherte Prozeduren auswählen. Der gespeicherte Prozedur im Abschnitt listet auch skalaren Werten, benutzerdefinierte Funktionen, die in das Modell übernommen werden können.

Normalerweise wird ein Entwickler Tabellen auswählen, und lassen Sie den Assistenten aus diesen Entitäten erstellen. In der Änderungsnachverfolgung und SaveChanges-Prozess, die weiter oben beschriebenen generiert das Entity Framework automatisch INSERT-, Update- und DELETE-Befehle für die Entitäten, die auf Tabellen basiert.

Let’s zuerst schauen Sie sich wie das Entity Framework zur Abfrage Sichten anstelle von Tabellen erzwungen werden können.

Datenbankansichten in das Modell geschaltet werden auch Entitäten. Entity Framework verfolgt Änderungen an diesen Entitäten, genauso wie für Entitäten, die Tabellen zugeordnet sind. Mithilfe von Ansichten ist ein Nachteil zu Identitätsschlüssel. Eine Datenbanktabelle wahrscheinlich müssen eine oder mehr Spalten als Primärschlüssel oder die Schlüssel gekennzeichnet. Standardmäßig wird der Assistent eine Entität Identität Schlüssel vom primären Schlüssel für eine Tabelle erstellen. Beim Erstellen von Entitäten, die Ansichten zuordnen (mit dem Primärschlüssel fehlen) ist der Assistent seine optimale Herleiten von dieser Identität Schlüssel durch einen zusammengesetzten Schlüssel über alle NULL-Werte in der Tabelle zu erstellen. Betrachten Sie eine Entität, die aus einer Ansicht mit vier NULL-Spalten erstellt: KontaktID FirstName, LastName und TimeStamp.

Die resultierenden vier Eigenschaften werden als EntityKeys markiert (im Designer verwendet ein Schlüsselsymbol an EntityKey-Eigenschaften), diese vier Eigenschaften, d. h., die die Entität besitzt einen EntityKey besteht.

Die KontaktID ist die einzige Eigenschaft, die erforderlich ist, um diese Entität eindeutig zu identifizieren. Nachdem das Modell erstellt wurde, können Sie EntityKey-Attribut der drei Eigenschaften auf False ändern, bleiben nur die KontaktID als einen designierten EntityKey daher den Designer verwenden.

Sie können auch – wenn möglich – Planen der ahead, Entwerfen von Ansichten, die die richtigen, NULL-Spalten.

Mit dem Schlüssel vorhanden das Entity Framework kann jede Entität eindeutig identifizieren und kann daher Änderungsnachverfolgung auf diese Entitäten durchführen und dann Änderungen in der Datenbank beibehalten, wenn SaveChanges aufgerufen wird.

Command-Generierung mit einer eigenen gespeicherten Prozeduren überschreiben

Für die Dauerhaftigkeit zurück an die Datenbank können Sie die Standard-Befehlsgenerierung überschreiben und stattdessen direkt mit Ihren eigenen Entity Framework einfügen, Update und Delete, die gespeicherte Prozeduren, wenn Änderungen beibehalten werden in die Datenbank zu sichern. Dies wird als bezeichnet “ gespeicherten Prozedur Zuordnung ”. Let’s betrachten, wie das funktioniert.

Eine gespeicherte Prozedur, die Sie in der EDM-Assistent (oder später in den Assistenten zum Aktualisieren) auswählen Come in das Modell wird eine Funktion im Abschnitt des Modells XML-Metadaten, die das Datenbankschema beschreibt. Es nicht automatisch Bestandteil des konzeptionellen Modells und alle-Darstellung wird nicht auf der Entwurfsoberfläche angezeigt.

Hier ist eine einfache einfügen, die gespeicherte Prozedur für eine Person-Tabelle in einer von mir erstellten Datenbank.

ALTER procedure [dbo].[InsertPerson]
           @FirstName nchar(50),
           @LastName nchar(50),
           @Title nchar(50)
AS
INSERT INTO [Entity FrameworkWorkshop].[dbo].[Person]
           ([FirstName]
           ,[LastName]
           ,[Title]           )
     VALUES
(@FirstName,@LastName,@Title)
SELECT @@IDENTITY as PersonID

Diese gespeicherte Prozedur führt nicht nur das Datenbank einfügen, wird dann des Primärschlüsselwertes, den SQL Server für die neue Zeile erstellt hat.

Wenn Sie dieses Verfahren im Assistenten auswählen, wird dieser als die folgende Funktion in das Modell Datenbankschema dargestellt:

<Function Name="InsertPerson" Aggregate="false" BuiltIn="false"   
 NiladicFunction="false" IsComposable="false" 
 ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
  <Parameter Name="FirstName" Type="nchar" Mode="In" />
  <Parameter Name="LastName" Type="nchar" Mode="In" />
  <Parameter Name="Title" Type="nchar" Mode="In" />
</Function>

Fenster „ Mapping Details des Designers können Sie diese Funktion InsertPerson Person Entität erstellt wurde, die basierend auf der Person-Tabelle, wie in der Abbildung 3 zuordnen.

Zuordnung gespeicherter Prozeduren auf einer Entität

Abbildung 3 Zuordnung gespeicherter Prozeduren auf einer Entität

Beachten Sie, dass in Abbildung 3 PersonID-Eigenschaft auf den Wert von der gespeicherten Prozedur zugeordnet wird. Diese spezielle Zuordnung bewirkt, dass das Entity Framework, aktualisieren das Person-Objekt im Arbeitsspeicher mit der Datenbank generierten Schlüssel, nach das Einfügen in der Datenbank ausgeführt wurde.

Eine wichtige Anforderung beim Zuordnen von Funktionen ist, dass alle Parameter in der Funktion auf eine Eigenschaft in der Entität zuordnen muss. Sie können nicht die Parameter eine Formel oder einen Wert zuordnen. Entwickler müssen jedoch viele Möglichkeiten zum Anpassen von Microsoft .NET Framework-Klassen, die diese Entitäten darstellen.

Sie können auch die Aktualisierungs- und Funktionen zuordnen. Zwar ist es nicht notwendig, alle drei Aktionen (Insert, Update und Delete) zuzuordnen, müssen Entwickler Aufmerksamkeit auf einige Regeln, die in der Dokumentation zu der Zuordnung nur einige der Funktionen beschrieben.

Abbildung 3 Beachten Sie, dass zwei Spalten rechts von der Eigenschaft (abgekürzt aufgrund von Spaltenbreite) sind: Verwenden Sie Ursprünglicher Wert und betroffene Zeilen. Entity Framework unterstützt vollständigen Parallelität und können Sie diese Attribute Parallelitätsprüfung bei der Update- und Delete-Funktionen bereitstellen. Überprüfen Sie das MSDN-Dokument “ Walkthrough: Zuordnen einer Entität in gespeicherte Prozeduren (Entity Data Model-Tools) , ” Weitere Informationen über dieses Feature.

Zur Laufzeit Wenn ein Benutzer eine neue Art der Person erstellt hat und dann die SaveChanges-Methode löst sehen Entity Framework die Funktion Zuordnung einfügen, in den Metadaten (basierend auf der Zuordnung in Abbildung 3 definiert). Er sendet den folgenden Befehl Ausführen der gespeicherten Prozedur, statt einen eigene INSERT-Befehl im Handumdrehen generieren:

exec [dbo].[InsertPerson] @FirstName=N'Julie',@LastName=N'Lerman',
@Title=N'Ms.'

Die Gap schließen und Verhindern der Tabelle des Zugriffs über Entity Framework

Entity Framework Befehle zum Beibehalten von Daten aus der Ansicht basierenden Entitäten generiert, aber Ansichten können nicht aktualisiert werden. Im Fall von nicht aktualisierbare Sichten können zuordnen, einfügen, aktualisieren und Löschen von gespeicherte Prozeduren auf die Entitäten und die vollständigen Roundtrip abrufen und Beibehalten von Daten ohne direkten Zugriff auf die Tabellen der Datenbank zu erhalten.

Sie könnten dazu etwas so einfaches wie erstellen Datenbankansichten, die in den Tabellen und gespeicherte Prozeduren, die die Spalten der Tabelle zu aktualisieren. Oder Sie haben eine komplexere Ansichten und komplexe gespeicherten Prozeduren mit erweiterten Logik zum Durchführen von Aktualisierungen. Könnte sogar supplant einige Ihrer Lesen gespeicherter Prozeduren mit Ansichten, die Entwickler zum Erstellen von Abfragen über die Sichten ermöglichen, etwas, das für gespeicherte Prozeduren nicht durchgeführt werden kann.

Als Beispiel für diese Komponierbarkeit könnte die Anwendung eine Abfrage für die CustomersInPastYear Entität, Filtern die Ansicht noch weiter mit den Kunden LastName-Eigenschaft anfordern:

from c in context.CustomersInPastYears
 where c.LastName.StartsWith("B")
 select c;

Dies führt zu den folgenden Befehl für die Datenbank ausgeführt werden:

SELECT
[Extent1].[CustomerID] AS [CustomerID], [Extent1].[FirstName] AS [FirstName], 
[Extent1].[LastName] AS [LastName], [Extent1].[EmailAddress] AS [EmailAddress], 
[Extent1].[TimeStamp] AS [TimeStamp]
FROM (SELECT 
      [CustomersInPastYear].[CustomerID] AS [CustomerID], 
      [CustomersInPastYear].[FirstName] AS [FirstName], 
      [CustomersInPastYear].[LastName] AS [LastName], 
      [CustomersInPastYear].[EmailAddress] AS [EmailAddress], 
      [CustomersInPastYear].[TimeStamp] AS [TimeStamp]
      FROM [dbo].[CustomersInPastYear] AS [CustomersInPastYear]) AS [Extent1]
WHERE [Extent1].[LastName] LIKE N'B%'

Der Compiler .NET würde eine ähnliche Abfrage besteht über eine gespeicherte Prozedur akzeptiert, der in das Modell zugeordnet ist. Allerdings würde Entity Framework führen die gespeicherte Prozedur in der Datenbank, alle seine Ergebnisse zurück an die Anwendung und dann den Filter anwenden, um die Objekte im Arbeitsspeicher, die von der gespeicherten Prozedur zurückgegebenen. Dies könnte potenziell verschwendet Ressourcen und beeinträchtigt die Leistung ohne Wissen des Entwicklers.

Abbildung 4 zeigt eine gespeicherte Prozedur, die die Tabelle "Debitor" mit die gleichen Spalten, die in der Customers-­ InPastYear Ansicht teilnehmen aktualisiert. Es kann wie die Update-Funktion für die Entität CustomersInPastYear verwendet werden.

Abbildung 4 UpdateCustomerFirstNameLastNameEmail gespeicherte Prozedur

ALTER PROCEDURE UpdateCustomerFirstNameLastNameEmail
@FirstName nvarchar(50),
@LastName nvarchar(50),
@Email nvarchar(50),
@CustomerId int,
@TimeStamp timestamp

AS

UPDATE Customer
   SET [FirstName] = @FirstName
      ,[LastName] = @LastName
      ,[EmailAddress] = @Email
 WHERE CustomerID=@CustomerId AND TimeStamp=@TimeStamp
 
 SELECT TimeStamp 
 FROM Customer
 WHERE CustomerID=@CustomerId

Jetzt können Sie diese gespeicherte Prozedur auf die Entität zuordnen. Die in Abbildung 5 gezeigten Zuordnung sendet die ursprünglichen TimeStamp der gespeicherten Prozedur und erfasst, dann verwenden die Result-Spalte-Bindungen aktualisierte TimeStamp, die von der gespeicherten Prozedur zurückgegeben.

Zuordnen einer gespeicherten Prozedur zu einer Entität, die basierend auf einer Sicht

Abbildung 5 Zuordnen einer gespeicherten Prozedur zu einer Entität, die basierend auf einer Sicht

Nachbereiten, solange das Modell auch dient die Ansicht basierenden Entitäten entsprechende Identitätsschlüssel haben und Funktionen sind ordnungsgemäß zugeordnet, besteht keine Notwendigkeit, Ihrer Datenbanktabellen für eine Anwendung verfügbar zu machen, die für die Datenzugriffsstrategie Entity Framework verwendet. Datenbankansichten und gespeicherte Prozeduren bieten das EDM und Entity Framework, Sie, benötigen um erfolgreich mit Ihrer Datenbank arbeiten.

Julie Lerman ist als Microsoft MVP, .NET-Mentor und Unternehmensberaterin tätig und wohnt in den Bergen von Vermont. Sie hält bei User Groups und Konferenzen in der ganzen Welt Vorträge zum Thema Datenzugriff und anderen Microsoft .NET-Themen. Lerman führt einen Blogs unter thedatafarm.com/blog und ist Autorin des hoch gelobten Titels "Programming Entity Framework" (O’Reilly Media, 2009). Führen Sie ihn auf die Twitter.com: julielerman.

Dank an die folgenden technischen Experten für die Überprüfung der in diesem Artikel: Noam-Ben-Ami und Srikanth Mandadi