2016-10-06 1 views
3

Ich verwende eine T4-Vorlage leicht von der in this vorgeschlagenen Antwort geändert, um Typoskript-Schnittstellen von meinem EF POCOs zu generieren.Get Standard-SQL-Wert von Entity Framework-Klasse

Die EF Core POCOs wurden zuerst als Datenbank generiert und einige der Datenbankspalten haben Standardwerte. Diese werden korrekt durch den EF-Generator in meinen Zusammenhang abgebildet, z. .HasDefaultValueSql("0");

Ich bin ein wenig verwirrt darüber, wie man auf den Standardwert für eine bestimmte EF-Klasse zugreifen, ich dachte, GetValueOrDefault könnte den Trick tun, aber das ist nur den Standardwert für den .net-Typ geben.

Ich sehe, es gibt einige andere Lösungen da draußen für die Arbeit, aber ich kann nicht scheinen, eine, die noch funktioniert mit ASP .Net Core.

Idealerweise würde ich gerne wissen, wie man bestimmt, ob eine Eigenschaft einen Standard-EF-Wert von MemberInfo hat, da die folgende Zeile aus der T4-Vorlage die Eigenschaftsbeschreibungen erzeugt, die am einfachsten zu ändern wäre Standardwert für das TypeScript def.

foreach (MemberInfo mi in GetInterfaceMembers(t)) 
{ 
    sb.AppendFormat(" {0}: {1};\n", mi.Name, GetTypeName(mi)); 
} 
+0

Es wäre viel einfacher, wenn Sie den Standardwert mit einem Datum Annotation Attribute gesetzt werden stattdessen. Etwas wie '[DefaultValue (" 0 ")]'. Sie können dann einfach mit 'MemberInfo.CustomAttributes' darauf zugreifen. – haim770

+0

Haben Sie Zugriff auf die Quelle' DbContext' in der Vorlage? –

+0

@ haim770 Ich erzeuge die Klassen aus einer Datenbank, die bereits existiert, ich besitze nicht die db und wenn es sich ändert, möchte ich in der Lage sein zu regenerieren, ohne die Standards manuell zu überprüfen –

Antwort

2

Falls Sie Zugriff auf die erzeugten DbContext haben, können Sie die Metadaten durch den DbContext.Model statt Reflexion vorgesehen verwenden.

Zum Beispiel:

foreach (var type in db.Model.GetEntityTypes()) 
{ 
    foreach (var property in type.GetProperties()) 
    { 
     var defaultValue = property.Relational().DefaultValue; 
    } 
} 

Es gibt auch viele nützliche Methoden wie IModel.FindEntityType, IEnityType.FindProperty usw.

+0

Ich habe Schwierigkeiten, es zu bekommen, um die Erweiterungs-Methoden von RelationalMetadataExtensions in der T4-Vorlage zu verweisen, funktioniert dieser Code gut in einer Klasse, aber ich bekomme "IProperty" enthält keine Definition für "relationalen" Fehler in der Textvorlage. irgendwelche Ideen? –

+1

Ah ich habe es musste ich auf die Assembly-DLL verweisen, und dann den Namespace auch danach. –

+0

In der Tat. Assemby: 'Microsoft.EntityFrameworkCore.Relational', Namespace:' Microsoft.EntityFrameworkCore' –

Verwandte Themen