最初にEntityFrameworkコードを使用するMVC4プロジェクトで、より管理しやすいリポジトリパターンへの更新に取り組んでいます。基本的なCRUD操作を実行する汎用ベースリポジトリクラスを統合したので、作成する各リポジトリにこれらを実装する必要はありません。エンティティがTrackableEntityのタイプである場合、Allメソッドが削除されたフラグでクエリをフィルタリングする必要があるという問題が発生しました。エンティティはベースリポジトリでジェネリックであるため、キャストしようとしているのはTrackableEntityのタイプであり、次のエラーメッセージが表示されます。
タイプ'NameSpace.Models.ClientFormField'の入力とタイプ'NameSpace.Models.TrackableEntity'のチェックを持つ'TypeAs'式はサポートされていません。LINQ to Entitiesクエリでは、エンティティタイプと複合型のみがサポートされています。
このエラーは完全に発生し、コードが機能しない理由は理解できますが、すべてのリポジトリでこのメソッドをオーバーライドせずに、削除されたアイテムを除外する方法を見つけようとしています。Allメソッド用に持っているコードは以下のとおりです。
public virtual IEnumerable<T> All()
{
if (typeof(T).IsSubclassOf(typeof(TrackableEntity)))
return dbSet.Where(e => !(e as TrackableEntity).IsDeleted).ToList();
return dbSet.ToList();
}
私は次のことができることを知っています
public virtual IEnumerable<T> All(Expression<Func<T, bool>> predicate = null)
{
if (predicate != null)
return dbSet.Where(predicate).IsDeleted).ToList();
return dbSet.ToList();
}
そして、これを私のすべてのリポジトリに追加します
public override IEnumerable<CaseType> All(Expression<Func<CaseType,bool>> predicate = null)
{
if (predicate == null)
predicate = e => !e.IsDeleted;
return base.All(predicate);
}
これに関して私が抱えている問題は、コードを複製していることです。これは基本的にすべてのリポジトリにコピーアンドペーストするため、この新しいリポジトリパターンに変更する目的が無効になります。リポジトリ内の重複したコードを終了するように切り替えました。
これが私のエンティティの1つの例です。
public class CaseType : TrackableEntity, IValidatableObject
{
public int Id { get; set; }
public string Name { get; set; }
public bool InUse { get; set; }
public bool IsValid { get { return !this.Validate(null).Any(); } }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (String.IsNullOrEmpty(Name))
yield return new ValidationResult("Case Type name cannot be blank", new[] { "Name" });
//Finish Validation Rules
}
}
そしてTrackableEntity
public abstract class TrackableEntity
{
public bool Active { get; set; }
public bool IsDeleted { get; set; }
public virtual User CreatedBy { get; set; }
public virtual User ModifiedBy { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateModified { get; set; }
}
これに関する助けをいただければ幸いです。