2017-01-25 2 views
0

Ich habe ein Projekt mit der ersten Datenbankansprache und einer SQL Server-Datenbank. Verwenden Sie den Standardwert in SQL, wenn die Zeichenfolge in der Entity null ist

In einem der Tische ich nicht auf NULL festlegbare Spalte mit einem Standardwert als leere Zeichenkette haben:

[Comments] NVARCHAR(1024) NOT NULL DEFAULT ('') 

Standardwert hier sollte immer ein leerer String sein völlig OData zu unterstützen „ist nicht leer“ Filter, die sonst gibt mir Datensätze mit Nullwerten zurück, die aus Geschäftssicht wirklich leer sind.

In meinem Modell Ich habe auch eine String-Eigenschaft für diese Spalte:

public string Comments { get; set; } 

Nun, was passiert, ist: vom Frontend I Nullwert erhalten kann, wenn entsprechende Eingabe nicht mit Daten gefüllt wird und dieser Wert abgebildet wird in die Entität, die dann von EF eingefügt wird.

Falls ich gerade versuche, einen Datensatz mit null "Comments" -Eigenschaft zu setzen, anstatt den Standardwert auf SQL-Seite zu bekommen, bekomme ich eine Ausnahme.

Ich habe versucht, es zu beheben, indem StoreGeneratedPattern für diese Spalte zu Computed in EDMX Einstellung. Jetzt kann ich Datensätze mit Nullen einfügen, und ich bekomme den Standardwert, aber ich bekomme es jedes Mal, auch wenn sie einen Wert in der Entity haben.

Mit anderen Worten, berechnet StoreGeneratedPattern ignoriert immer den Wert dieser Eigenschaft in Entität und die Deaktivierung StoreGeneratedPattern im Grunde lässt mich mit keinem Standardwert auf der SQL-Seite.

Was ich will, ist dieses Problem im Backend auf eine nette Weise zu lösen.

  1. Ich will nicht, um es zu lösen, indem sie einfach immer leeren String vom Frontend zu senden und das Hinzufügen von Validierung an das Backend, die diese Eigenschaft nicht null ist. Es wird mich zwingen, das gleiche für andere Kunden (z. B. einen mobilen Client) zu tun und für jede Form und Tabelle, wo ich die gleiche Situation erlebe.

  2. Ich will nicht, um es zu lösen, indem sie wie etwas zu tun:

    entity.Comments = entity.Comments ?? string.empty; 
    

    im Backend. Es wird mich zwingen, es an jedem Ort zu tun, an dem ich diese und andere ähnliche Dinge verarbeite.

  3. Ich möchte nicht lösen, indem Sie eine Schnittstelle für ähnliche Entitäten oder durch Initialisierung dieser Eigenschaft im Konstruktor verwenden. Ich habe eine einzige T4-Vorlage, die aus Entkopplungsgründen Entity-Modelle für EDMX erstellt, so dass alle Modelle automatisch generiert werden und niemals angepasst werden sollten.

Das Verhalten, das ich erwartet hatte und das ich erreichen möchte, wie folgt:

wenn EF versucht, einen Datensatz mit Nullwert für diese Spalte, SQL Server verwenden Standard einzufügen, fügt er sonst was die Entität hatte.

Alle Ideen oder Lösungen würden sehr geschätzt werden.

+0

Setzen Sie es auf eine leere Zeichenfolge im Entitätskonstruktor. – DavidG

+0

In C# können Sie den Standardwert des Werts im Entitätskonstruktor oder in der Eigenschaft mithilfe eines Eigenschafteninitialisierers festlegen. Sie könnten auch eine Überschreibung in Ihrem DbContext oder ObjectContext erstellen, um den Wert auf eine leere Zeichenfolge für alle Änderungen an Stringeigenschaften festzulegen, die beibehalten werden (Sie können sogar mit Attributen filtern). Oder in der Datenbank könnten Sie einen Trigger erstellen, um den Wert zu ändern, wenn er null ist, um eine leere Zeichenfolge zu sein. Ich bin mir nicht sicher, warum Sie sich für OData interessieren, OData sollte mit Null/Leer-Vergleichen umgehen. Besser wäre es, den Wert auf null zu setzen, wenn eine leere Zeichenfolge vorhanden ist. – Igor

+0

@Igor Ich führe eine Konvertierung von ODataQueryOptions in ODataQueryOptions die innerhalb verwendet Auto Mapper und Ausdrücke Mapping. Grundsätzlich endet der Filter "Ist nicht leer" in der SQL-Abfrage; where columnname! = ''; Das direkte Initialisieren dieser Eigenschaft mit einem leeren String ist aufgrund vieler Faktoren keine Lösung. Aber ich mag deine Idee mit Trigger. Ich werde es versuchen! –

Antwort

0

Ich habe eine generische Funktion I

private T SetNullStringToDefault<T>(T entity, string default) 
{ 
    List<PropertyInfo> properties = entity.GetType().GetProperties().ToList(); 
    foreach(var property in properties) 
    { 
     //if property is string 
     if(property.PropertyType == typeof(string)) 
     { 
      string value = property.GetValue(entity, null) as string; 
      if (string.IsNullOrEmpty(value)) 
       property.SetValue(entity, default, null); 
     } 
    } 
    return entity; 
} 

Und es wie es

your_object = SetNullStringToDefault<EntityType>(your_object, "Default Value"); 

vor Ihrem Einsatz rufen in meine CRUD-Funktionen für solche Aufgaben Verwenden Sie einfach passieren Ihr Objekt, konvertiert es alle Ihre NULL-String-Eigenschaften auf Ihren Standardwert.

+0

Danke, aber dieser Ansatz ignoriert vollständig die SQL-Ebene, wo ich gerne Standardwerte definieren könnte, die verwendet werden, wenn eine Spalte, die keine Nullwerte zulässt, null als Wert abruft. Meine ursprüngliche Idee war es, keine Vorgabewerte im Backend zu setzen, da ich den DB-Ansatz habe und ich möchte, dass alle Modelle komplett in der DB konfiguriert sind. Wenn Sie eine Erweiterungsmethode aufrufen, müssen Sie nicht vergessen, sie an jeder Stelle aufzurufen, an der sie benötigt wird. Es ist nicht die beste Vorgehensweise in großen Unternehmensprojekten (das ist mein Fall), wo Sie die Möglichkeit eines Entwicklerfehlers minimieren sollten. –

Verwandte Themen