2013-08-20 3 views
1

Я использую предоставленный EF5.0 EntityGenerator T4 шаблон. Я пытаюсь выяснить, как получить схему и таблицу каждого объекта, поскольку генератор создает каждый класс. Мое намерение состоит в том, чтобы добавить два константные свойства каждого класса следующим образом:Как получить имя схемы и таблицы объекта в EF5.0 EntityGenerator?

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 не являются моей сильной стороной.

+0

Схема по умолчанию EF - 'dbo', поэтому это должно быть одинаковым для всех объектов. Имя таблицы использует использование службы плюрализации EF, которая может быть [отключена] (http://stackoverflow.com/questions/4425027/entity-framework-code-first-naming-conventions-back-to-plural-table- имена) в контексте. Таким образом, они равны именам классов – boindiil

+0

Это неверно. Сначала я использую DB, и у меня много разных схем. –

+0

, а не «получить», если вам нужно знать, настройте себя. modelBuilder.Entity <>() ToTable ("TableName", "схемы"). –

ответ

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 для каждого объекта, который существует в моем контексте.

0

См. http://brewdawg.github.io/Tiraggo.Edmx/, вы можете установить его через NuGet в Visual Studio, и он обслуживает все метаданные из ваших файлов EDMX, которые Microsoft скрывает от вас, очень просто, отлично работает.

Смежные вопросы