Generating/using table 在 EF Reverse POCO 生成器的帮助下 Entity Framework 6.x 中的值函数
Generating/using table valued functions in Entity Framework 6.x with the help of EF Reverse POCO Generator
在我的项目中,我严重依赖 Simon Hughes 的 EF Reverse POCO 生成器。
我有一个 TVF GetItemSummaries
,它有 4 个参数和 returns 一个 table。这个 TVF 实际上是一个视图的补充(我认为生成器由于缺少 PK 而无法识别视图)。
现在,运行 在 SQL Mgnt Studio 中工作正常!
我想将该 TVF 添加到 .tt 模板,但我在设置时遇到了问题。 (几乎)没有关于如何执行此操作的信息。
- 首先,我将 POCO 与 DBContext 和 *Configuration 类 以及 IDBContext 接口分开。
到目前为止我做了什么:
我设置 IncludeTableValuedFunctions = true;
并按照说明包含 "EntityFramework.CodeFirstStoreFunctions" Nuget 包。
从那里开始,我迷路了。
我试图在 TableFilterInclude
和 StoredProcedureFilterInclude
过滤器正则表达式中包含 TVF 名称。没有运气。该过滤器适用于 tables,但不适用于 TVFs。
然后我尝试手动将实际函数添加到DBContext
和IDBContext
类,但返回的类型是自定义类型[=21] =],未定义。等等等等
这是我手动添加到 DbContext 的内容(我希望它会为我生成),但仍然不起作用,因为 DbContext 不知道 ItemSummary
类型:
partial void OnModelCreatingPartial( DbModelBuilder modelBuilder )
{
modelBuilder.Conventions.Add( new FunctionsConvention<BusinessContext>( "dbo" ) );
}
[DbFunction( "BusinessContext", "FindItemSummaries" )]
public IQueryable<ItemSummary> FindItemSummaries( Guid customerId, DateTime startDate, DateTime endDate, int programId )
{
var customerParameter = new ObjectParameter( "customerId", customerId );
var startDateParameter = new ObjectParameter( "startDate", startDate );
var endDateParameter = new ObjectParameter( "endDate", endDate );
var programIdParameter = new ObjectParameter( "programId", programId );
var oc = ( ( IObjectContextAdapter ) this ).ObjectContext;
var query = String.Format( "[{0}].{1}", GetType().Name, "[FindItemSummaries](@customerId, @startDate, @endDate, @programId)" );
var result = oc.CreateQuery<ItemSummary>( query, customerParameter, startDateParameter, endDateParameter, programIdParameter );
return result;
}
最重要的是,我不明白如何设置它。有没有人这样做过? "EntityFramework.CodeFirstStoreFunctions" Nuget 包如何以及在哪里发挥作用?我确实阅读了他们关于该主题的博客 post
非常感谢。
将 POCO Generator 更新到版本 2.18.1 后已解决此问题
然后 TVF 按预期出现在 DbContext 中。
在我的项目中,我严重依赖 Simon Hughes 的 EF Reverse POCO 生成器。
我有一个 TVF GetItemSummaries
,它有 4 个参数和 returns 一个 table。这个 TVF 实际上是一个视图的补充(我认为生成器由于缺少 PK 而无法识别视图)。
现在,运行 在 SQL Mgnt Studio 中工作正常!
我想将该 TVF 添加到 .tt 模板,但我在设置时遇到了问题。 (几乎)没有关于如何执行此操作的信息。
- 首先,我将 POCO 与 DBContext 和 *Configuration 类 以及 IDBContext 接口分开。
到目前为止我做了什么:
我设置
IncludeTableValuedFunctions = true;
并按照说明包含 "EntityFramework.CodeFirstStoreFunctions" Nuget 包。 从那里开始,我迷路了。我试图在
TableFilterInclude
和StoredProcedureFilterInclude
过滤器正则表达式中包含 TVF 名称。没有运气。该过滤器适用于 tables,但不适用于 TVFs。然后我尝试手动将实际函数添加到
DBContext
和IDBContext
类,但返回的类型是自定义类型[=21] =],未定义。等等等等
这是我手动添加到 DbContext 的内容(我希望它会为我生成),但仍然不起作用,因为 DbContext 不知道 ItemSummary
类型:
partial void OnModelCreatingPartial( DbModelBuilder modelBuilder )
{
modelBuilder.Conventions.Add( new FunctionsConvention<BusinessContext>( "dbo" ) );
}
[DbFunction( "BusinessContext", "FindItemSummaries" )]
public IQueryable<ItemSummary> FindItemSummaries( Guid customerId, DateTime startDate, DateTime endDate, int programId )
{
var customerParameter = new ObjectParameter( "customerId", customerId );
var startDateParameter = new ObjectParameter( "startDate", startDate );
var endDateParameter = new ObjectParameter( "endDate", endDate );
var programIdParameter = new ObjectParameter( "programId", programId );
var oc = ( ( IObjectContextAdapter ) this ).ObjectContext;
var query = String.Format( "[{0}].{1}", GetType().Name, "[FindItemSummaries](@customerId, @startDate, @endDate, @programId)" );
var result = oc.CreateQuery<ItemSummary>( query, customerParameter, startDateParameter, endDateParameter, programIdParameter );
return result;
}
最重要的是,我不明白如何设置它。有没有人这样做过? "EntityFramework.CodeFirstStoreFunctions" Nuget 包如何以及在哪里发挥作用?我确实阅读了他们关于该主题的博客 post
非常感谢。
将 POCO Generator 更新到版本 2.18.1 后已解决此问题 然后 TVF 按预期出现在 DbContext 中。