无法访问存储库以获取 visual studio MVC 中的对象
Can't access repository to get object in visual studio MVC
在控制器中,我试图获得 "Grade",使用:
Grade g = gradeRepository.FindById(1);
findById 在 GradeRepository 中声明:
public class GradeRepository : IGradeRepository
{
private ProjectContext context;
private DbSet<Grade> grades;
public GradeRepository(ProjectContext context)
{
this.context = context;
grades = context.Grades;
}
public IQueryable<Grade> FindAll()
{
return grades.OrderBy(g => g.name);
}
public Grade FindById(int gradeId)
{
return grades.Include(l => l.DeterminateTableProp).FirstOrDefault(g => g.GradeInt == gradeId);
}
public void Remove(Grade grade)
{
grades.Remove(grade);
}
public void SaveChanges()
{
context.SaveChanges();
}
}
服务已在 nijectwebcommon 文件中正确注册:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IContinentRepository>().To<ContinentRepository>().InRequestScope();
kernel.Bind<IGradeRepository>().To<GradeRepository>().InRequestScope();
kernel.Bind<ProjectContext>().ToSelf().InSingletonScope();
}
这可能是什么问题?
我正在做的与我正在使用的另一个存储库完全相同。
回答
检查 InnerException property of the TargetInvocationException 找出问题所在。
InnerException 的重要性
这就是您需要查看 InnerException
的原因。通过 reflection 调用了某些方法,也许是工厂方法。该方法抛出异常,并且该异常隐藏在 TargetInvocationException
的 InnerException
属性 中,因为反射调用方法异常会发生这种情况。他们躲起来了。因此,您需要检查 InnerException
以找出 真正 出了什么问题。
The intro and remarks on MSDN tell the story of TargetInvocationException
很好。
这可能是什么问题?
从你的代码来看,可能是反射调用了 GetConstructorForType
工厂方法,如果 Grade
缺少默认构造函数,它将抛出异常。
internal static ConstructorInfo GetConstructorForType(Type type)
{
System.Diagnostics.Debug.Assert(type != null);
ConstructorInfo ci = type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance, null, System.Type.EmptyTypes, null);
if (null == ci)
{
ThrowConstructorNoParameterless(type);
}
return ci;
}
在控制器中,我试图获得 "Grade",使用:
Grade g = gradeRepository.FindById(1);
findById 在 GradeRepository 中声明:
public class GradeRepository : IGradeRepository
{
private ProjectContext context;
private DbSet<Grade> grades;
public GradeRepository(ProjectContext context)
{
this.context = context;
grades = context.Grades;
}
public IQueryable<Grade> FindAll()
{
return grades.OrderBy(g => g.name);
}
public Grade FindById(int gradeId)
{
return grades.Include(l => l.DeterminateTableProp).FirstOrDefault(g => g.GradeInt == gradeId);
}
public void Remove(Grade grade)
{
grades.Remove(grade);
}
public void SaveChanges()
{
context.SaveChanges();
}
}
服务已在 nijectwebcommon 文件中正确注册:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IContinentRepository>().To<ContinentRepository>().InRequestScope();
kernel.Bind<IGradeRepository>().To<GradeRepository>().InRequestScope();
kernel.Bind<ProjectContext>().ToSelf().InSingletonScope();
}
这可能是什么问题? 我正在做的与我正在使用的另一个存储库完全相同。
回答
检查 InnerException property of the TargetInvocationException 找出问题所在。
InnerException 的重要性
这就是您需要查看 InnerException
的原因。通过 reflection 调用了某些方法,也许是工厂方法。该方法抛出异常,并且该异常隐藏在 TargetInvocationException
的 InnerException
属性 中,因为反射调用方法异常会发生这种情况。他们躲起来了。因此,您需要检查 InnerException
以找出 真正 出了什么问题。
The intro and remarks on MSDN tell the story of TargetInvocationException
很好。
这可能是什么问题?
从你的代码来看,可能是反射调用了 GetConstructorForType
工厂方法,如果 Grade
缺少默认构造函数,它将抛出异常。
internal static ConstructorInfo GetConstructorForType(Type type)
{
System.Diagnostics.Debug.Assert(type != null);
ConstructorInfo ci = type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance, null, System.Type.EmptyTypes, null);
if (null == ci)
{
ThrowConstructorNoParameterless(type);
}
return ci;
}