Wie sollte ich auf eine berechnete Spalte in Entity Framework Code First?
Bin ich mit Entity Framework Code First-in meinem ASP.NET MVC-Anwendung. Eine meiner Klassen hat mehrere Spalten, die addiert werden. Ich bin für das speichern dieser Spalten berechnete Spalten in den Tabellen durch ausführen einer alter table-script in der Datenbank-Initialisierung. Lassen Sie uns sagen, die Klasse sieht wie folgt aus:
public class Bond
{
public decimal ParAmountOfIssuance { get; set; }
public decimal AccruedInterest { get; set; }
public decimal Premium { get; set; }
public decimal OriginalIssueDiscount { get; set; }
}
Dem alter-Skript ist so etwas wie:
alter table Bonds
add TotalSources as (ParAmountOfIssuance + AccruedInterest + Premium - OriginalIssueDiscount)
Möchte ich die Total Sources
Spalte für die Anzeige in der web-app. Was ist der beste Weg, dies zu erreichen? Die [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
Attribut funktioniert nicht, da EF-Code erstellt Zuerst die Tabelle aus der Klasse vor dem alter-Skript wird ausgeführt.
Anregungen sind willkommen.
- Konnte Sie nicht verwenden, [NotMapped] und berechnen Sie diese im code? Es ist nicht viel von "code first" auf diese Weise. Warum müssen Sie die alter schema im Skript?
- Ich fürchte, dass das, was Sie bereits gefunden ist das Ergebnis: Es ist nicht möglich, lassen Sie EF-erstellen Sie eine Datenbank mit einer berechneten Spalte (abgesehen von timestamp oder rowversion-Eigenschaften). Aber Sie müssen die
Computed
Attribut auf dem Grundstück, damit EF-Griff berechnete Spalten korrekt (nur Lesen, nie schreiben). Folge ist, dass es funktioniert nur mit Zuordnung zu bestehenden DBs, aber nicht mit einer DB erstellt von EF Code-First. Siehe auch hier: msdn.microsoft.com/en-us/library/gg193958.aspx im Abschnitt "DatabaseGenerated", 2. Absatz. - Ich will nicht, um die Berechnungen durchzuführen, die im code, weil ich nicht sicher weiß, dass mein Antrag ist der einzige, der jemals ändern Sie die Werte der Spalten. Die alter-Skript erstellt, das die berechneten Spalten. Das ist, wenn Sie gefragt, ob ich ausführen sollte, die Berechnungen im code, wenn die Daten bearbeitet/eingesehen werden, das ist das, was ich derzeit tun. Es scheint nicht, wie die beste Vorgehensweise.
- Wenn Sie brauchen, um eine gewisse Logik in Ihrer Datenbank, dass ist ok, wenn Sie akzeptieren Kompromisse. Wenn Sie CodeFirst und Datenbank erzeugen, das bedeutet, dass Ihre Datenbank hängt von Ihrer Anwendung. Aber wenn Sie sich nicht sicher sind, verwenden Sie die Datenbank in mehr als einer Anwendung, dann wirkt sich CodeFirst. Wenn Sie mit CodeFirst, dann sollten Sie völlig nicht bewusst, Datenbank, es wird abstrahiert, und wenn Sie benötigen, um Daten auszutauschen, dann odata-oder andere service-option. Als dies nicht geschehen kann, ohne Skript in der aktuellen version von CF -, bedeutet das, dass es nicht unterstützt wird CF :S
- Was ist, wenn Sie verwenden würden [DatabaseGenerated(DatabaseGeneratedOption.Berechnet)] oder [DatabaseGenerated(DatabaseGeneratedOption.None)] - Attribut, und dann vom script nur verändert diese Spalte mit der Formel? So CF nicht schreiben in diesem Bereich, und Sie werden in der Lage sein, es zu Lesen. Auf diese Weise ist es nicht anders als mit der bestehenden Datenbank und unterstützt wird.
- Nie Verstand. Ich sehe jetzt, dass EF wirft Ausnahme in diesem Fall.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe etwas von einem workaround.
Können Sie nur verwenden, berechnetes Feld auf eine vorhandene Datenbank.
Wenn Sie fügen Sie Ihre Immobilie in CF-Objekt als:
und wenn Sie fügen Sie eine Zeile in Ihrem Skript, das löschen von Informationen zur Generierung der Datenbank:
CF davon aus, dass diese bestehende Datenbank und es wird funktionieren, habe ich gerade ausprobiert.
UPDATE, ich vergaß, wenn Sie die Eigenschaft hinzufügen, um Ihre Anleihe Einheit wie diesem, dann im Skript müssen Sie es ändern, um machen Sie es berechnet, nicht hinzuzufügen 🙂
Sie können auch manuell auf "synchronisieren" Datenbank - und Modell- zu zeigen, wo Sie alles haben ohne zu arbeiten in diesem Feld, fügen Sie es im Modell berechnet und in der Tabelle berechnet. Beim löschen von hash von edm-Metadaten-Tabelle der CF arbeiten, ohne zu versuchen, sich zu regenerieren-Modell mit der Datenbank.
Dies ist definitiv nicht unterstützt - Definition
Computed
option benutzerdefinierte Eigenschaft werfen eine Ausnahme. Die erste Code = Logik im code. Wenn Sie müssen benutzerdefinierte berechnete Eigenschaften verwenden Sie die Datenbank zuerst. Das einzige Datenbank-Logik unterstützt durch code first ist die identity-Spalte und timestamp.Das problem ist, dass man die Spalte markiert werden, als berechnet, aber das erstellen der Datenbank nicht erlauben. Wenn die Spalte ist nicht markiert, wie berechnet, wird es aktualisiert = EF generiert update-Anweisungen versucht, zu aktualisieren dieser Spalte, die nicht in der Datenbank.
Mache ich berechnete Spalten, die in der CF - (WinForms), wie (ich weiß nicht, ob es die beste ist):
Dies ist eine Einheit:
Dies ist Form2: