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.

InformationsquelleAutor Robert S. | 2011-08-04
Schreibe einen Kommentar