【发布时间】:2020-06-03 13:08:47
【问题描述】:
我有一个通用存储库,可以通过 ID 获取实体或获取所有实体:
internal class Repository<TEntity> : IRepository<TEntity>
where TEntity : BaseEntity
{
protected SaiContext Context { get; }
/// <summary>Gets the entity set.</summary>
protected virtual DbSet<TEntity> Set => Context.Set<TEntity>();
public Repository(SaiContext context)
{
Context = context;
}
public async Task<TEntity> GetAsync(int entityId, IEnumerable<string> includeProperties = null)
{
try
{
return await GetQueryableWithIncludes(includeProperties).SingleAsync(entity => entity.Id == entityId);
}
catch (InvalidOperationException)
{
throw new EntityNotFoundException(typeof(TEntity), entityId);
}
}
public async Task<IEnumerable<TEntity>> GetAllAsync(IEnumerable<string> includeProperties = null)
{
return await GetQueryableWithIncludes(includeProperties).ToListAsync();
}
protected IQueryable<TEntity> GetQueryableWithIncludes(IEnumerable<string> includeProperties = null)
{
IQueryable<TEntity> queryable = Set;
if (includeProperties == null)
{
return queryable;
}
foreach (var propertyName in includeProperties)
{
queryable = queryable.Include(propertyName);
}
return queryable;
}
}
为实体关系配置 DbContext 后,所有实体的导航属性以及所有其他属性都被正确加载。
现在我被要求使用temporal SQL tables,以便所有实体都有一个有效范围。
如果使用 SQL,我会在查询中包含 FOR SYSTEM_TIME AS OF @validityDate。
为了尊重@validityDate,调整现有实现的最简单方法(如果有的话)是什么?
我尝试过的:
- 在执行 SQL 查询时寻找一种配置所需系统时间的方法。问题:我找不到方法。
- 通过允许将
@validityDate作为参数传递的表值函数公开查询。问题:我无法使用 Linq2Sql 传递参数(或者至少我没有弄清楚如何)。 - 创建一个执行连接的表值函数(而不是让 EF 执行连接),以便可以使用
context.FromSqlRaw(<query>)调用它。 ISSUE: 如何创建 c# 对象树? (由于存在一对多关系,因此返回多行)
我发现所有使用时态表的示例都使用FromSqlRaw。如果可能的话,我想避免它,因为这意味着整个数据库上下文配置变得无用,并且必须包含映射的附加代码。
【问题讨论】:
标签: c# linq-to-sql entity-framework-core temporal-tables