我正在使用提供的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模板不是我的强项。
答案 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文件中的所有元数据,非常简单,效果很好。