mogę założyć, że od Entity Framework jest zdolny do tworzenia mapowania między model koncepcyjny i składowania modelu, posiada wewnętrzną zdolność do oddania każdy typ bazy danych do odpowiedniego typu koncepcyjne.
Co więcej, Entity Framework wykorzystuje klasy pomocnicze, które istnieją w EF.Utility.CS.ttinclude w swoich szablonach T4 nagłówka do generowania plików źródłowych kontekstu i encji.
EF.Utility.CS.ttinclude z kolei używa klas od System.Data.Metadata.Edm Namespace, w szczególności PrimitiveTypeKind Enumeration, który obejmuje typy pojęciowe i stanowi pomost między typami baz danych a typami CLR.
Wartość PrimitiveTypeKind Enumeration można znaleźć w PrimitiveType Class jako własność i że klasa ma inną ciekawą właściwość o nazwie ClrEquivalentType który zgodnie z oczekiwaniami powraca System.Type.
PrimitiveType Class Wystąpienia można pobierać na różne sposoby. W szablonach T4 struktura Entity działa pod numerem EdmItemCollection Class, która ma GetPrimitiveTypes Method.
W szablonów T4, najprostszym sposobem, aby uzyskać dostęp do EdmItemCollection Class jest wykorzystanie (z EF.Utility.CS.ttinclude) metodę CreateEdmItemCollection MetadataLoader, która przyjmuje jako parametr ścieżkę do edmx pliku.
W pliku tt, można napisać:
<#@ 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#>
<#
}
#>
Rezultatem będzie:
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
W zwykły kod C#, można zrobić to samo, jeśli trzeba MetadataLoader. Aby pominąć tę przeszkodę, wystarczy skopiować klasę MetadataLoader do kodu. Istnieją jednak inne sposoby osiągnięcia tego celu. Jeśli pracujesz z podejściem Code First, interesującym rozwiązaniem jest użycie EdmxWriter.WriteEdmx Method (DbContext, XmlWriter) w celu dynamicznego utworzenia pliku edmx w MemoryStream, a następnie przesłanie tego strumienia jako argumentu do XmlReader.Create Method (Stream) i ostatecznie użycie czytnika xml jako parametru wejściowego w EdmItemCollection Constructor (IEnumerable).
Istnieją również sposoby zastąpienia typy CLR przez C# typów (dopuszczające wartość null <System.Int32> ==> int?), Ale to już inna historia ...
Czy można uznać za pomocą 'Dictionary 'zamiast instrukcji switch? –
ys ale chcę użyć jakiegoś wewnętrznego dostawcy z ef, który robi rzecz .. nie chcę tego przełącznika i obudowy ... –
Cóż, nie wiem nic w EF, ale na pewno powiedziałbym, że słownik byłby czystszy niż przełącznik/obudowa. –