【问题标题】:How can I get the schema and table name of the entity in the EF5.0 EntityGenerator?如何在 EF5.0 EntityGenerator 中获取实体的架构和表名?
【发布时间】:2013-08-23 01:16:38
【问题描述】:

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

【问题讨论】:

  • EF 的默认架构是dbo,所以这对于所有实体应该是相同的。表名使用 EF 复数服务,在上下文中可以是disabled。这样它们就等于类名
  • 这是不正确的。我首先使用 DB,并且有许多不同的模式。
  • 如果你需要知道,而不是“得到它”,请自行设置。 modelBuilder.Entity().ToTable("Tablename","schema");

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


【解决方案1】:

我发现了这个问题: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 副本。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      相关资源
      最近更新 更多