2009-04-10 1 views
32

Ich habe eine Datenbank, von der ich ein EF-Modell erstellen möchte, aber ich möchte bestimmte Spalten nicht aus der Datenbank einfügen, da die betreffenden Spalten ausschließlich auf dem Server verwaltet werden und nicht manipuliert werden sollten jede Anwendung.Entity Framework: Spalten ignorieren

Beide Spalten sind DateTime (wenn dies einen Unterschied macht), eine der Spalten ist nullwertfähig und wird von einem Auslöser für Aktualisierungen verwaltet, und die andere Spalte ist nicht nullfähig und mit einem Standardwert in der Tabellendefinition festgelegt.

Ich denke, ich suche etwas wie die "Server Generated" -Option in Linq2Sql; aber ich kann eine solche Option nicht finden.

Kann mir jemand sagen, wie man das umgeht?

Caveat:

Ich habe versucht, Business-Objekt-Modellierung an meinem Arbeitsplatz seit einigen Jahren einzuführen und es hat immer wegen der Höhe des zusätzlichen Code abgelehnt wurde, die Handkurbel sein. EF wird derzeit aufgrund der Designer- und Codegenerierung als praktikable Lösung angesehen. Daher wird jede Option, die das Hand-Cranking des XML beinhaltet, nur den Rest meiner Kollegen von EF abbringen. Ich suche daher nach etwas, das entweder mit dem Designer oder mit Code getan werden kann.

EDIT:

Ich denke, das hier für das, was ich bin auf der Suche entweder ...

(a) eine Möglichkeit, das Modell ohne EF Bezugnahme auf die Spalten in dem Speicher (SSDL) zu erstellen und deshalb nicht, um es in irgendeiner Weise zu manipulieren (b) eine Möglichkeit, das "StoreGeneratedPattern" Attribut gegen die Eigenschaft zu setzen, wenn ich den ObjectContext erstellen (die einfache Antwort ist, dies manuell in der .ssdl zu manipulieren, aber das wäre dann überschrieben werden, wenn ich das Modell aus der Datenbank aktualisiert habe, und ich kann die Route, wo die .csdl, .msl & .ssdl sind Handkurbel).

Antwort

1

Soll die Spalte nicht im Modell angezeigt werden?

Versuchen Sie, die Spalte in der Designer-Ansicht auszuwählen und drücken Sie die Löschtaste.

bearbeiten

Sie könnten der Setter für die Eigenschaft als privat. Dann kann Ihre App den Wert nicht ändern.

+3

Leider, wenn ich dies versuche, bekomme ich dann Fehler im Modell, da die Spalte nicht zugeordnet ist. –

+0

Welche Art von Fehlern? – TGnat

+0

Fehler 3023: Problem beim Zuordnen des Fragments ab Zeile 197: Die Spalte TableName.ColumnName in der Tabelle TableName muss zugeordnet werden: Sie hat keinen Standardwert und kann keine Nullwerte enthalten. –

2

Können Sie keine Ansicht mit den benötigten Spalten erstellen und sie über den Assistenten für Entitätsfunktionen importieren und den Entitäten zuordnen?

+2

Danke, das eine Lösung sein könnte, wenn ich zu vermeiden, würde es vorziehen, eine Ansicht für jede Tabelle zu erstellen, wenn ich kann - die Spalten ich in meiner ursprünglichen beschrieben haben Problem tatsächlich auf jeder Tabelle in der Datenbank angezeigt. –

0

Klicken Sie mit der rechten Maustaste auf das Feld in der grafischen Darstellung und wählen Sie Löschen. Ich habe festgestellt, dass Sie manchmal Fehler bekommen, wenn Sie viele Änderungen an der Modellierung vornehmen und damit beginnen, Ihre Änderungen zu verfolgen. Am besten können Sie das EF-generierte Modell neu erstellen.

Beachten Sie, dass bei der "Aktualisierung von der Datenbank", dass alte Felder auf den generierten Modellen nicht entfernt werden, Sie sie manuell entfernen müssen. Wenn Sie beispielsweise DateField1 in DateField2 in Ihrer Datenbank umbenannt haben und dann "Modell von Datenbank aktualisieren", sehen Sie nun sowohl DateField1 als auch DateField2 für das resultierende Modell. Dies kann eine Ursache für Fehler sein.

+0

Dies funktioniert für die Spalte, die Nullable sein kann, aber nicht für die Spalte funktioniert, die nicht NULL-Werte zulässt. Dies führt zu demselben Fehler wie die obige Option von TGnat. –

+0

Fehler 3023: Problem beim Zuordnen des Fragments ab Zeile 197: Die Spalte TableName.ColumnName in der Tabelle TableName muss zugeordnet werden: Sie hat keinen Standardwert und kann keine Nullwerte enthalten. –

+0

Ich habe dich ... Ich glaube, du steckst fest. Interessanter Hinweis ... Ich habe eine rowversion (timestamp) -Spalte in einer meiner db-Tabellen, und der EF-Generator hat das StoreGeneratedPattern-Attribut korrekt gesetzt:

28

Können Sie dies mit dem Entity Framework tun? Ja; es ist einfach.Können Sie dies mit dem Entity Framework Designer tun? Leider ist das viel schwieriger.

Das Problem, das Sie haben, ist, dass die Spalte in dem Speicherschema existiert (SSDL) in Ihrem EDMX. Das Entfernen der Spalte mit dem GUI-Designer entfernt sie einfach aus dem Client-Schema, nicht aus dem Mapping oder dem Speicherschema. Es ist jedoch einfach genug, um in das EDMX zu gehen und es zu entfernen. Nachdem Sie das getan haben, können Sie es auch aus dem Mapping in den Client-Schema-Teilen des EDMX entfernen, und das Entity-Framework wird sich länger darüber beschweren, dass es nicht zugeordnet ist.

Problem gelöst, nicht wahr?

Nun, nein. Wenn Sie den EDMX mithilfe des GUI-Designers aus der Datenbank aktualisieren, wird das Speicherschema verworfen und neu generiert. So wird deine Spalte zurückkommen. Soweit ich weiß, gibt es keine Möglichkeit, dem GUI-Designer mitzuteilen, niemals eine bestimmte Spalte zuzuordnen. Sie müssen dies bei jedem Update mit dem GUI-Designer erneut tun. Glücklicherweise ist EDMX XML, also können Sie dies mit einer XML-Transformation, LINQ oder dem XML-Tool Ihrer Wahl tun.

+1

Danke, ich habe erkannt, dass ich dies durch Bearbeiten des XML-Codes tun kann, ich habe nur gehofft, dass es einen anderen Weg gibt - wie zum Beispiel das StoreGeneratedPattern-Attribut beim Erstellen des Kontexts programmatisch festzulegen. –

+1

Nun, die Antwort ist die gleiche (für StoreGeneratedPattern). Sie können StoreGeneratedPattern in der XML-Datei festlegen, und es funktioniert gut, aber der GUI-Designer wird es wegblasen, wenn Sie aktualisieren.Das Entity Framework verfügt über Funktionen, die der GUI-Designer noch nicht vollständig unterstützt. –

+0

Die einzige andere Möglichkeit besteht darin, Ihre Datenbankmetadaten so zu ändern, dass der GUI-Designer erkennt, was Sie wollen. Aber ich weiß nicht, wie der GUI-Designer SSDL im speziellen Fall von StoreGeneratedPattern erzeugt. –

0

Zeitstempel sind, ein anderer Datentyp ist als Datumzeit. Der Zeitstempel scheint von der Engine als Attribut erkannt zu werden, ähnlich wie bei einem Identitätsattribut. Sie können ein Timestamp-Attribut nicht "aktualisieren". Daher kann das EDM es korrekt verwalten (genauso wie es eine Identität tut).

0

Sie könnten die Textvorlage ändern, um diese Spalten zu ignorieren, wenn Ihre Entitätsklassen zu erzeugen. Wenn Sie beispielsweise der Dokumentationszusammenfassung "IGNORE" hinzugefügt haben, können Sie die Vorlage so ändern, dass sie durch Ersetzen ignoriert wird.

Dim simpleProperties as IEnumerable(Of EdmProperty) = typeMapper.GetSimpleProperties(entity) 

mit;