Chciałbym automatycznie wygenerować dokumentację z listą tabel i pól na podstawie Entity Framework Code First. W jaki sposób to zrobić?
Chciałbym automatycznie wygenerować dokumentację z listą tabel i pól na podstawie Entity Framework Code First. W jaki sposób to zrobić?
Entity Framework przechowuje wewnętrznie informacje o modelu w tzw. Workspace. Klasa ObjectContext posiada właściwość MetadataWorkspace, która umożliwia pobranie wszystkich potrzebnych informacji.
Niestety klasa DbContext, która jest podstawą podejścia Code First, nie posiada już tej właściwości.
Ale zarówno ObjectContext, jak i DbContext implementują interfejs IObjectContextAdapter. Musimy odpowiednio zrzutować DbContext na ObjectContext i dzięki temu uzyskamy dostęp do wszystkich właściwości ObjectContext:
public static class DbContextExtensions { public static MetadataWorkspace MetadataWorkspace(this DbContext context) { ObjectContext objectContext = (context as IObjectContextAdapter).ObjectContext; return objectContext.MetadataWorkspace; } }
Proszę zauważyć, że skorzystaliśmy tutaj z mechanizmu metod rozszerzających (Extension Methods).
W następnym kroku możemy pobrać informacje o encjach:
public static IEnumerable<EntityType> GetEntities(this DbContext context) { var entities = context.MetadataWorkspace() .GetItemCollection(DataSpace.OSpace) .GetItems<EntityType>() .ToList(); return entities; }
Teraz możemy skorzystać z tych metod. Tutaj przykład wygenerowania dokumentacji na konsolę:
using(var context = new DASContext()) { var entities = context.GetEntities(); entities .ToList() .ForEach(x => { System.Console.WriteLine("{0}", x.Name); x.Properties .ToList() .ForEach( p => System.Console.WriteLine("{0} - {1}", p.Name, p.TypeName)); System.Console.WriteLine("klucze:"); x.KeyProperties .ToList() .ForEach(k => System.Console.WriteLine(k.Name)); });
Oczywiście, zależnie od potrzeb możemy wygenerować dokument w PDF lub FlowDocument WPF.
Innym rozwiązaniem jest zastosowaniem gotowej biblioteki EntityFramework.MappingAPI.
Szczegółowy opis:
https://efmappingapi.codeplex.com/documentation?referringTitle=Home