我正在使用泛型和依赖注入来学习存储库和工作单元模式。我有一个持续的错误,我一直在搅拌,我显然缺少一些基本的东西。
我收到以下错误,虽然我明白它正在寻找一个名为'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 <<<<<
}
答案 0 :(得分:0)
我走在正确的轨道上,这是因为我从基地实体继承。
当我重新阅读我的问题时,它变得清晰。
解决方案是简单地不继承基本实体类,一切都很好。