私は誰でもこれを手伝ってくれることを願っています。私はTPC(コンクリートクラスごとのテーブル)とEF6を使用します。リビジョンを保存するテーブルはたくさんあります。つまり、テーブル内のすべての行が同じIDを持ちますが、複数のバージョンがあることを意味します。 1つのバージョンが現在のバージョン(たとえば、)です。 テーブルの学生サンプル:エンティティフレームワークキャストはサポートされていません
Id Version Name CurrentVersion
1 1 Murtin false
1 2 Martin true
2 1 Reinold true
私のモデルでは継承を使用しています。すべてのモデルのベースは、私がコースの学生の
abstract class RevisionBase : EntityBase, IRevisionBase
{
[Key]
[Column(Order = 1)]
public int Version { get; set; }
[Required]
public bool CurrentVersion { get; set; }
}
が今私のテーブル私はで動作する次のベースクラスに、使用したセーブ改訂されているすべてのテーブルについて
abstract class EntityBase: IEntityBase
{
[Key]
[Column(Order = 0)]
public int Id { get; set; }
}
をEntityBaseさ
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という列があることは分かっている。すべてのレコードをロードする前にこれをチェックしたいと思います。
大きなイワン、ありがとう。私は最初のバージョンをチェックして、それは実際に動作しています。 1つのSQL文だけがDBに送信されます。このSQL文には、両方の条件が含まれています。今私は自分自身のために第二の方法を学ぶことを試みます... – Dosihris
うわー、第二の方法も働いています!残念ながら私は一度だけ投票できます! – Dosihris
あなたは歓迎されています。喜んで助けました:) –