依赖注入和通用基类

时间:2016-07-07 01:52:00

标签: dependency-injection entity-framework-6 autofac asp.net-mvc-5

我正在使用泛型和依赖注入来学习存储库和工作单元模式。我有一个持续的错误,我一直在搅拌,我显然缺少一些基本的东西。

我收到以下错误,虽然我明白它正在寻找一个名为'Id'的数据库表列

因为我的Entity类继承自BaseEntity,我怀疑这是问题,但我不明白为什么以及我最好做些什么来修复它。

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

错误返回

  

EntityFramework.SqlServer.dll中出现“System.Data.Entity.Core.EntityCommandExecutionException”&gt;类型的异常,但未在用户代码中处理

     

附加信息:执行命令&gt;定义时发生错误。有关详细信息,请参阅内部异常。

内部异常

  

{“无效的列名'Id'。”}

要添加一些上下文,我使用EF6 MVC5和AutoFac进行Dependancy注入。

实体类 (数据库中不存在列'id' - 数据库中的键是'EmrgencyAttendanceId'),Entity类也将键设置为'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方法传递Lambda表达式。我使用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方法传递Lambda表达式。

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类 存储库类继承自存储库基类,该基类实现了将lambda传递给'Expression&gt;的Get方法。 @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 <<<<<
 } 

1 个答案:

答案 0 :(得分:0)

我走在正确的轨道上,这是因为我从基地实体继承。

当我重新阅读我的问题时,它变得清晰。

解决方案是简单地不继承基本实体类,一切都很好。