我是MVC应用程序的新手,我遇到了一个非常具体的问题。事实上,我有两个班:“Paciente”和“Analises”。
public class Paciente
{
public virtual Guid PacienteID { get; set; }
public virtual string Nome { get; set; }
public virtual string Sexo { get; set; }
public virtual DateTime DataDeNasc { get; set; }
public virtual int IdadeDiag { get; set; }
public virtual IList<Analises> analises { get; set; }
}
public class Analises
{
public virtual Guid AnaliseID { get; set; }
// some analysiss values
public virtual decimal afp { get; set; }
public virtual decimal hemoglobina { get; set; }
public virtual DateTime DataDaAnalise { get; set; }
public virtual Paciente pac { get; set; }
}
因此,患者有很多分析,每个分析都有一名患者(多对多)。
我用NHIbernate和FluentNHibernate映射了这个:
public PacienteMap()
{
Table("pacientes");
Id(x => x.PacienteID).GeneratedBy.Guid();
Map(x => x.Nome);
Map(x => x.Sexo);
Map(x => x.DataDeNasc).CustomType("Date");;
Map(x => x.IdadeDiag);
HasMany(m => m.analises).Not.KeyNullable().Fetch.Join().KeyColumn("pacienteid");
}
public AnalisesMap()
{
Table("analises");
Id(x => x.AnaliseID).GeneratedBy.Guid();
Map(x => x.afp);
Map(x => x.hemoglobina);
Map(x => x.DataDaAnalise).CustomType("Date");
References(x => x.pac).ForeignKey("pacienteid").Not.Nullable();
}
我的问题是我正在使用jTable来展示这一点。我想看一个患者名单(并且它有效),然后是每个患者的分析清单(不起作用!)
我的控制器是这样的:
[HttpPost]
public JsonResult AnalisesList(Guid pacienteId)
{
try
{
var list_analises = AnalisesRepository.GetPacienteAnalises(pacienteId);
var all_analises = Mapper.Map<IEnumerable<Analises>, IEnumerable<AnalisesView>>(list_analises);
List<AnalisesView> analises = all_analises.ToList();
return Json(new { Result = "OK", Records = analises });
}
catch (Exception ex)
{
return Json(new { Result = "ERROR", Message = ex.Message });
}
}
我也在使用automapper来自数据库对象的对象视图。
所以,现在,我的分析列表没有显示!我不知道为什么。 GetPacienteAnalises就像:
public IList<T> GetPacienteAnalises (Guid pacienteId)
{
using (ISession session = SessionManager.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
return session.CreateCriteria(typeof(T)).Add(Restrictions.Eq("pacienteid", pacienteId)).List<T>();
}
}
}
所以,我认为一切都很好......但我一直收到“无法解决财产:pacienteid:Infraestrutura.Models.Analises”。
答案 0 :(得分:1)
你的问题在这一行:
return session.CreateCriteria(typeof(T))
.Add(Restrictions.Eq("pacienteid", pacienteId))
.List<T>();
我认为T
在这种情况下是Analises
。 Analises
没有名为pacienteid
的媒体资源。相反,它有一个名为pac
的属性。将"pacienteid"
替换为"pac.PacienteID"
。创建条件时使用的字段应该是属性名称,而不是列名称。
return session.CreateCriteria(typeof(T))
.Add(Restrictions.Eq("pac.PacienteID", pacienteId))
.List<T>();
如果您使用Paciente
的主键Nome
以外的某些列进行过滤,则需要进行连接。在这种情况下,你会做类似的事情:
session.CreateCriteria(typeof(T))
.CreateAlias("pac", "p") // CreateAlias performs an inner join
.Add(Expression.Eq("p.Nome", name))
.List<T>()
但是不需要加入pac.PacienteID
。