【发布时间】:2016-10-08 01:25:22
【问题描述】:
我希望有人可以帮助我解决这个问题。我将 EF6 与 TPC 一起使用(每个具体类的表)。有许多表是修订保存的,这意味着表中的每一行都有相同的 ID,但有多个版本。一个版本是当前版本(例如)。 表学生样本:
Id Version Name CurrentVersion
1 1 Murtin false
1 2 Martin true
2 1 Reinold true
我在模型中使用继承。所有模型的基础都是EntityBase
abstract class EntityBase: IEntityBase
{
[Key]
[Column(Order = 0)]
public int Id { get; set; }
}
对于所有修订保存的表,我使用下一个基类
abstract class RevisionBase : EntityBase, IRevisionBase
{
[Key]
[Column(Order = 1)]
public int Version { get; set; }
[Required]
public bool CurrentVersion { get; set; }
}
现在我和我一起工作的桌子,当然是学生
class Student: RevisionBase
{
[Required]
public string Name{ get; set; }
}
所以下面的代码既简单又有效
new DBContext().Student.FirstOrDefault(s=>s.Id=5 && s.CurrentVersion=true)
对于统一的数据处理,我希望始终使用相同的基本方法进行加载。所以我有统一的错误处理和日志记录。这个通用的 get 方法应该总是加载当前版本,如果它是一个版本化的表。
private TEntity GeneralGet<TEntity>(int id) where TEntity : EntityBase
{
using (var ctx = GetContext())
{
if (typeof(IRevisionBase).IsAssignableFrom(typeof(TEntity)))
{
var allResultsId = ctx.Set<TEntity>().Where(l => l.Id == id);
var result = allResultsId.ToList().Cast<IRevisionBase>().FirstOrDefault(r => r.CurrentVersion);
return result as TEntity;
}
else // ansonsten, bei nicht versionierten Objekten
{
var result = ctx.Set<TEntity>().FirstOrDefault(l => l.Id == id);
return result;
}
}
}
这完全有效,但不幸的是我必须加载相同 id 的所有行并过滤内存中的当前版本。 (ToList 加载具有给定 id 的所有行。)
有没有更好的方法?
我不想要这个“ToList”。我需要的是检查我当前版本的演员表,或者混合方法链方式和硬编码过滤器字符串。 (不好,但比这好得多)我知道这个表有一列 CurrentVersion。我想在加载所有记录之前检查一下。
【问题讨论】:
标签: c# entity-framework