2017-01-02 1 views
-1

I EF-Kodex Zuerst bin mit und das ist mein Modell mit Daten Annotation:Wie kann ich SQL die berechnete Spalte im Code verwenden ersten

public int Count { get; set; } 
public int Fee { get; set; } 

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public int? Total { get; set; } 

Und ich habe eine Funktion in SQL Server:

ALTER FUNCTION dbo.Function4 
(
    @Count INT, @Fee INT 
) 
RETURNS Int 
AS 
    BEGIN 
    DECLARE @Result INT 
    SET @Result = @Count * @Fee 
    RETURN 
    @Result 
END 

und in der berechneten Spalte Spezifikation des Gesamt schreibe ich diese Formel:

([dbo].[Function4]([Count],[Fee])) 

Dies funktioniert gut. Aber meine Frage ist: Wann immer ich mein Modell ändere, wird die Datenbank neu erstellt, weil ich DropCreateDatabaseIfModelChanges verwendet habe. Ich kann die [DatabaseGenerated(DatabaseGeneratedOption.Computed)] entfernen und aus dem Code berechnen, aber ich möchte wissen, was ist die [DatabaseGenerated(DatabaseGeneratedOption.Computed)] Verwendung in Code zuerst?

+1

Haben Sie extern Ihre Funktion 'dbo erstellt .Funktion4' und Sie sind besorgt, es wird verschwinden und nicht wieder erstellt werden? –

+0

@ Nick.McDeerjung Ja. Genau mein Problem ist das. –

+0

Ich kann mir zwei Lösungen vorstellen, die funktionieren können oder nicht. 1. Machen Sie einfach eine Inline-berechnete Spalte (wenn möglich). Dann brauchen Sie die UDF nicht in der Datenbank; 2. Verwenden Sie ein Datenbankprojekt, das Sie zusammen mit allem anderen bereitstellen. Das Datenbankprojekt enthält Ihre benutzerdefinierte Funktion und wird zu einem bestimmten Zeitpunkt implementiert. –

Antwort

0

Die Verwendung von

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 

zeigt an, dass die Datenbank einen Wert erzeugt, wenn eine Zeile eingefügt oder aktualisiert wird.

See here

+0

Ich weiß, was DatabaseGeneratedOption.Computed ist. Aber meine Frage ist, wenn ich zuerst Code und DropCreateDatabaseIfModelChanges verwende, wenn ich mein Modell ändere, wird die berechnete Spaltenformel in der Datenbank gelöscht, weil ich DropCreateDatabaseIfModelChanges verwendet habe. –

+0

Warum haben Sie DropCreateDatabaseIfModelChanges verwendet? Ich meine, ist es notwendig? – Dronacharya

+0

Da ich mein Modell in der Regel ändere und jedes Mal, wenn ich es ändere, wird meine DB erneut erstellt. –

0

DatabaseGeneratedOption.Computed- bedeutet Eigenschaft ein entsprechendes Feld hat, die in der Datenbank existiert - soll aber der Wert aus der Datenbank abgerufen werden, anstelle von C#

von vorbei
+0

Ich weiß, was die 'DatabaseGeneratedOption.Computed' ist. Aber meine Frage ist, wenn ich zuerst Code und DropCreateDatabaseIfModelChanges verwende, wenn ich mein Modell ändere, wird die berechnete Spaltenformel in der Datenbank gelöscht, weil ich DropCreateDatabaseIfModelChanges verwendet habe. –

+0

Sie können versuchen, https://blog.3d-logic.com/2014/10/18/the-final-version-of-the-store-functions-for-entityframework-6-1-1-code-first- Konvention veröffentlicht /.Oder führen Sie eine SQL-Abfrage aus, die in Ihrem Seed eine Funktion erzeugt. –

Verwandte Themen