Extension methods for ObjectContext and DbContent to get the mapped table name from an entity.
Table of contents
The problem
I am working on a set of extension methods to perform a bulk insert using Entity Framework, using internally the SqlBulkCopy object. One of the steps involved is to get
the mapped table name from an entity. After some google searching, I found a
post on StackOverflow that led me to the solution.
The solution
The trick is to use the method
ObjectQuery.ToTraceString to generate
a SQL Select statement for an entity, and then extract the table name from that statement.
Let’s assume that you have an entity named Album corresponding to a table named dbo.Albums.
string sql = context.CreateObjectSet<T>().ToTraceString();
...
The generated SQL for that entity can be something like this:
SELECT
[Extent1].[AlbumId] AS [AlbumId],
[Extent1].[GenreId] AS [GenreId],
[Extent1].[ArtistId] AS [ArtistId],
[Extent1].[Title] AS [Title],
[Extent1].[Price] AS [Price],
[Extent1].[AlbumArtUrl] AS [AlbumArtUrl]
FROM [dbo].[Albums] AS [Extent1]
So, all we need to do is to parse the SELECT statement to get the table name. This is the approach used in the post above but it has some limitations – that code will
work only for tables that are in the default SQL Server schema (dbo.{tableName}). I made some changes to that code and I’m extracting the full
table name using regular expressions.
The extension methods
I have created one extension method for DbContext and other for
ObjectContext:
public static class ContextExtensions
{
public static string GetTableName<T>(this DbContext context) where T : class
{
ObjectContext objectContext = ((IObjectContextAdapter) context).ObjectContext;
return objectContext.GetTableName<T>();
}
public static string GetTableName<T>(this ObjectContext context) where T : class
{
string sql = context.CreateObjectSet<T>().ToTraceString();
Regex regex = new Regex("FROM (?<table>.*) AS");
Match match = regex.Match(sql);
string table = match.Groups["table"].Value;
return table;
}
}
Using the code
Getting the mapped table name for an entity named Album, using a
ObjectContext object:
ObjectContext context = ....;
string table = context.GetTableName<Album>();
Or using a
DbContext object:
DbContext context = ....;
string table = context.GetTableName<Album>();
References
My name is Rui Jarimba and I was born in Madeira island, Portugal and I currently live in Dublin, Ireland.
I’m working as a .NET software developer since 2005.
Some of my professional interests are:
Web development using .NET Framework;
Service Oriented Architecture (SOA);
Database development and modelling;
Web accessibility, usability, and standards;
Software Architecture;
Design Patterns