2

我正在使用提供的 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 模板不是我的强项。

4

2 回答 2

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 批量副本。

于 2013-08-21T20:20:12.780 回答
0

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

于 2013-09-23T01:08:43.387 回答