如何在EF5.0 EntityGenerator中获取实体的模式和表名?

时间:2013-08-20 20:24:38

标签: c# .net entity-framework code-generation t4

我正在使用提供的EF5.0 EntityGenerator T4模板。我试图弄清楚如何在生成器创建每个类时获取每个实体的模式和表。我的目的是为每个类添加两个const属性,如下所示:

public class MyEntity {
    public const string TABLE = "MyEntityTable";
    public const string SCHEMA = "MyEntitySchema";
}

我无法弄清楚如何利用T4模板中的内容进行修改来执行此操作。这是我到目前为止(第一行已经在T4模板中):

<#=codeStringGenerator.EntityClassOpening(entity)#>
{
    public const string TABLE = "testTable";
    public const string SCHEMA = "testSchema";
<#

...并且T4模板继续。我想用适当的信息替换“testTable”和“testSchema”。任何帮助都会非常感激,因为T4模板不是我的强项。

2 个答案:

答案 0 :(得分:0)

我发现了这个问题:How to get the Schema name of a Table in Entity Framework?并从那里建立起来。我的解决方案是首先在链接文章中创建扩展方法,然后将ObjectContext扩展方法修改为以下内容:

public static string GetTableAndSchema<T>(this ObjectContext context) where T : class
{
    var sql = context.CreateObjectSet<T>.ToTraceString();
    var startTrim = sql.LastIndexOf("FROM") + 5;
    var initialTrim = sql.SubString(startTrim);
    var endTrim = initialTrim.IndexOf("AS");

    return sql.Substring(startTrim, endTrim).Replace("[","").Replace("]","");
}

这允许我将以下内容放在我的GenericRepository中:

public GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : EntityBaseClass{
    //REMOVED IRRELEVANT CODE

    private MyContextType _context;

    public virtual void AddBulk<IEnumerable<TEntity> toAdd, string connectionString, int batchSize)
    {
        using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.CheckContstraints | SqlBulkCopyOptions.KeepIdentity))
        {
            sbc.DestinationTableName = _context.GetTableAndSchema<TEntity>();

            //DO THE REST OF SQL BULK COPY
        }
    }
}

这对我来说很有效,现在允许我为我的上下文中存在的每个实体都有一个SQL Bulk副本。

答案 1 :(得分:0)

请参阅http://brewdawg.github.io/Tiraggo.Edmx/,您可以在Visual Studio中通过NuGet安装它,它可以提供Microsoft隐藏的EDMX文件中的所有元数据,非常简单,效果很好。