kann ich davon ausgehen, dass da Entity Framework können Mappings zwischen Begriffsmodell und Speichermodell zu schaffen, es interne Fähigkeit hat, jede Datenbank Typen entsprechende konzeptionelle Art zu werfen.
Darüber hinaus verwendet Entity Framework Hilfsklassen, die im Header EF.Utility.CS.ttinclude in seinen T4-Vorlagen vorhanden sind, um Kontext- und Entitätsquelldateien zu generieren.
EF.Utility.CS.ttinclude wiederum verwendet intern Klassen von System.Data.Metadata.Edm Namespace, insbesondere PrimitiveTypeKind Enumeration, die konzeptionelle Typen abdecken und eine Brücke zwischen Datenbanktypen und CLR-Typen bilden.
Wert von PrimitiveTypeKind Enumeration kann in PrimitiveType Class als Eigentum zu finden, und diese Klasse hat eine weitere interessante Eigenschaft namens ClrEquivalentType, die als System.Type erwarteten Renditen.
PrimitiveType Class Instanzen können auf verschiedene Arten abgerufen werden. In T4-Vorlagen arbeitet Entity Framework mit EdmItemCollection Class, das GetPrimitiveTypes Method hat.
In T4-Vorlagen ist der einfachste Weg, auf EdmItemCollection Class zuzugreifen, die CreateEdmItemCollection-Methode von MetadataLoader (aus EF.Utility.CS.ttinclude), die als Parameterpfad zur EDMX-Datei führt.
In tt Datei, könnten Sie schreiben:
<#@ template hostSpecific="true" #>
<#@ output extension=".txt" #>
<#@ include file="EF.Utility.CS.ttinclude" #><#
var edmxPath = "NorthwindModel.edmx"; // <--- Put the path to your model here.
var loader = new MetadataLoader(this);
var edmItemCollection = loader.CreateEdmItemCollection(edmxPath);
var primitiveTypes = edmItemCollection.GetPrimitiveTypes();
#>
<#
foreach (var primitiveType in primitiveTypes)
{
#>
<#= primitiveType#> ==> <#= primitiveType.ClrEquivalentType#>
<#
}
#>
Das Ergebnis wird:
Edm.Binary ==> System.Byte[]
Edm.Boolean ==> System.Boolean
Edm.Byte ==> System.Byte
Edm.DateTime ==> System.DateTime
Edm.Decimal ==> System.Decimal
Edm.Double ==> System.Double
Edm.Guid ==> System.Guid
Edm.Single ==> System.Single
Edm.SByte ==> System.SByte
Edm.Int16 ==> System.Int16
Edm.Int32 ==> System.Int32
Edm.Int64 ==> System.Int64
Edm.String ==> System.String
Edm.Time ==> System.TimeSpan
Edm.DateTimeOffset ==> System.DateTimeOffset
Edm.Geometry ==> System.Data.Spatial.DbGeometry
Edm.Geography ==> System.Data.Spatial.DbGeography
Edm.GeometryPoint ==> System.Data.Spatial.DbGeometry
Edm.GeometryLineString ==> System.Data.Spatial.DbGeometry
Edm.GeometryPolygon ==> System.Data.Spatial.DbGeometry
Edm.GeometryMultiPoint ==> System.Data.Spatial.DbGeometry
Edm.GeometryMultiLineString ==> System.Data.Spatial.DbGeometry
Edm.GeometryMultiPolygon ==> System.Data.Spatial.DbGeometry
Edm.GeometryCollection ==> System.Data.Spatial.DbGeometry
Edm.GeographyPoint ==> System.Data.Spatial.DbGeography
Edm.GeographyLineString ==> System.Data.Spatial.DbGeography
Edm.GeographyPolygon ==> System.Data.Spatial.DbGeography
Edm.GeographyMultiPoint ==> System.Data.Spatial.DbGeography
Edm.GeographyMultiLineString ==> System.Data.Spatial.DbGeography
Edm.GeographyMultiPolygon ==> System.Data.Spatial.DbGeography
Edm.GeographyCollection ==> System.Data.Spatial.DbGeography
Im Klar C# -Code, könnten Sie gleiche tun, wenn Sie MetadataLoader haben würde. Um dieses Hindernis zu umgehen, kopieren Sie einfach die MetadataLoader-Klasse in Ihren Code. Es gibt jedoch auch andere Möglichkeiten, das Ziel zu erreichen. Wenn Sie mit dem Code First-Ansatz arbeiten, ist die interessante Lösung, EdmxWriter.WriteEdmx Method (DbContext, XmlWriter) zu verwenden, um edmx-Datei dynamisch in MemoryStream zu erstellen und dann diesen Stream als Argument in XmlReader.Create Method (Stream) und schließlich XML-Leser als Eingabeparameter in EdmItemCollection Constructor (IEnumerable) zu verwenden.
Es gibt auch Methoden CLR-Typen von C# Typen (Nullable <System.Int32> ==> int?), Aber es ist eine andere Geschichte ...
Haben Sie darüber nachgedacht mit einem 'Dictionary 'anstelle einer switch-Anweisung? –
ys aber ich möchte einige innere Anbieter von EF verwenden, die das Ding tut .. ich will diesen Schalter und Fällen nicht ... –
Nun, ich weiß nichts von EF, aber ich würde definitiv sagen, dass ein Wörterbuch wäre sauberer als Schalter/Gehäuse. –