0

ジェネリックスと依存性注入を使用してリポジトリと作業単位パターンを学習しています。私は一貫して誤りを抱えており、私は何か基本的なことがはっきりしていません。依存性注入とジェネリックベースクラスのエラー

私は私のエンティティクラスがBaseEntityから継承するので、私はこれが問題である疑いがあるが、私は理解していない、私はそれが「ID」

と呼ばれるデータベーステーブルの列を探していることを理解しながら、次のエラーを取得していますなぜそれを解決するのが最善であるのか。

public class BaseEntity<T> 
    { 
     public T Id { get; set; } 
    } 

エラーは型 'System.Data.Entity.Core.EntityCommandExecutionException'>の例外がEntityFramework.SqlServer.dllで発生した

を返されたが、ユーザーコードで処理されなかった

追加情報:コマンド>定義の実行中にエラーが発生しました。詳細については、内部例外を参照してください。

内部例外

{ "無効な列名 'ID'。"}

私は依存性の注入のためのEF6 MVC5とAutoFacを使用していますいくつかのコンテキストを追加します。

エンティティクラス (列「ID」は、データベースに存在しない - データベース内のキーは「EmrgencyAttendanceId」である)とエンティティクラスは、そうのような「EmrgencyAttendanceId」としてキーを設定します。

[Table("reporting.EDISRecords")] 
    public class EDISRecord : BaseEntity<int> 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.None)] 
     public int EmergencyAttendanceId { get; set; } 

     [StringLength(50)] 
     public string Hospital { get; set; } 

     [StringLength(20)] 
     public string URNumber { get; set; } 

コントローラーアクション コントローラは、ラムダ式を通過EDISRecordServiceするのGetRecordメソッドを呼び出します。私はDbFunctions.TruncateTimeを使用します。これは、データベースが日付時刻として保存されるため、日付のみを検索したいからです。

public ActionResult Search(string Date, string CaseNumber) 
     { 
      if (!string.IsNullOrEmpty(Date) || !string.IsNullOrEmpty(CaseNumber)) 
      { 
       DateTime dt = DateTime.Parse(Date); 
       var EmergencyAttendance = _edisRecordService.GetRecord(m => (DbFunctions.TruncateTime(m.ArrivalDateTime) == dt) && (m.RTAIdentifier == CaseNumber)); 

        //for initialising view model 
       SeperationSummaryViewModel model = new SeperationSummaryViewModel(); 


       //assign values for view model 
       if (EmergencyAttendance != null) 
       { 
        if (EmergencyAttendance.DepartureDestination != null) 
        { 
         if (EmergencyAttendance.DepartureDestination.Substring(0, 1) == ".") 
         { 
          model.DepartureDestination = EmergencyAttendance.DepartureDestination.Substring(1); 
         } 
         else 
         { 
          model.DepartureDestination = EmergencyAttendance.DepartureDestination; 
         } 
        } 
        else 
        { 
         model.DepartureDestination = "Not recorded by Emergency Department"; 
        } 
        if (EmergencyAttendance.InpatientAdmissionDiagnosis != null) 
        { 
         model.InpatientAdmissionDiagnosis = EmergencyAttendance.InpatientAdmissionDiagnosis; 
        } 
        else 
        { 
         model.InpatientAdmissionDiagnosis = "Not recorded by Emergency Department"; 
        } 
       } 
       //send view model into UI (View) 
       return PartialView("_SeperationInformationPartialView", model); 
      } 
      else 
      { 
       if (string.IsNullOrEmpty(Date) || string.IsNullOrEmpty(CaseNumber)) 
       { 
        return PartialView("Blank"); 
       } 
      } 

      return PartialView("Error"); 
     } 

サービスクラス サービスクラスは、作業単位をインスタンス化し、ラムダ式を通過するリポジトリGetメソッドを呼び出します。リポジトリクラスはにラムダを渡すGetメソッドimplimentsリポジトリ基本クラスから継承し

public class EDISRecordService : IEDISRecordService 
    { 
     private readonly IUnitOfWork<DataWarehouseDataManager> _unitOfWork; 

     public EDISRecordService(IUnitOfWork<DataWarehouseDataManager> unitOfWork) 
     { 
      _unitOfWork = unitOfWork; 
     } 

     public EDISRecord GetRecord(Expression<Func<EDISRecord, bool>> @where) 
     { 
      return _unitOfWork.EDISRecordRepository.Get(@where); 
     } 



    } 

RepositoryBaseクラス '式を> @Where'

public class RepositoryBase<TEntity> : Disposable, IRepository<TEntity> 
    where TEntity : class 
{ 
    private readonly DbContext _dataContext; 

    private IDbSet<TEntity> Dbset 
    { 
     get { return _dataContext.Set<TEntity>(); } 
    } 

    public RepositoryBase(DbContext dbContext) 
    { 
     _dataContext = dbContext; 
    } 

    public TEntity Get(Expression<Func<TEntity, bool>> @where) 
    { 
     return Dbset.Where(where).FirstOrDefault(); 
    } 

    protected override void DisposeCore() 
    { 
     if (_dataContext != null) 
      _dataContext.Dispose(); 
    } 
} 

それはこの方法で失敗した

public TEntity Get(Expression<Func<TEntity, bool>> @where) 
{ 
    return Dbset.Where(where).FirstOrDefault(); <<<<<< Fails Here <<<<< 
} 

答えて

0

私は正しい軌道に乗っていました。私はベースエンティティから継承していたからです。

私の問題を読んだとき、それは明らかになりました。

解決策は、単純に基本エンティティクラスから継承しないことであり、すべてが良好です。