简体   繁体   English

带有MVC3和jTable的Postrgresql一对多

[英]Postrgresql One-To-Many with MVC3 and jTable

I'm a newbie in MVC apps, and I've encountered a very specific problem. 我是MVC应用程序的新手,并且遇到了非常具体的问题。 Thing is, I have 2 classes: "Paciente" and "Analises". 问题是,我有2个班级:“ 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; } 

}

So, a Patient has many Analysis, and each Analysis has one Patient (on-to-many). 因此,一个病人有很多分析,并且每个分析都有一个病人(多对多)。

I have mapped this with NHIbernate and FluentNHibernate: 我已经用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();
    }

My problem is that I'm using jTable to show this. 我的问题是我正在使用jTable来显示此内容。 I want to see a list of Patients (and it works), and then, a list of analysis for each patient (doesn't work!) 我想查看“患者列表”(并且有效),然后查看每个患者的分析列表(“无效”!)

My Controller goes like this: 我的控制器如下所示:

 [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 });
        }
    }

I am also using automapper to go from the Object Views from Database Objects. 我还使用自动映射器从数据库对象的对象视图中进行操作。

So, rigth now, my analysis list does not show! 因此,很遗憾,我的分析列表未显示! I don't know why. 我不知道为什么 The GetPacienteAnalises is like: 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>();

            }
        }  
    }

So, I think everything is Okay... But I keep receiving a "could not resolve property: pacienteid of: Infraestrutura.Models.Analises". 因此,我认为一切都很好...但是我一直收到“无法解析属性:的理由:Infraestrutura.Models.Analises”。

Your problem is in this line: 您的问题在这一行:

return session.CreateCriteria(typeof(T))
    .Add(Restrictions.Eq("pacienteid", pacienteId))
    .List<T>();

I assume that T in this case is Analises . 我假设在这种情况下TAnalises Analises does not have a property named pacienteid . Analises没有名为pacienteid的属性。 Instead, it has a property named pac . 相反,它具有一个名为pac的属性。 Replace "pacienteid" with "pac.PacienteID" . "pacienteid"替换为"pac.PacienteID" The fields that you use when creating the criteria should be the property names, not the column names. 创建条件时使用的字段应该是属性名称,而不是列名称。

return session.CreateCriteria(typeof(T))
    .Add(Restrictions.Eq("pac.PacienteID", pacienteId))
    .List<T>();

If you were filtering by some column other than Paciente 's primary key, Nome for example, then a join would be necessary. 如果您按除Paciente的主键(例如Nome之外的其他列进行过滤,则必须进行Paciente In that case, you would do something like: 在这种情况下,您将执行以下操作:

session.CreateCriteria(typeof(T))
    .CreateAlias("pac", "p")            // CreateAlias performs an inner join
    .Add(Expression.Eq("p.Nome", name))
    .List<T>()

But no join is needed to get to pac.PacienteID . 但是不需要pac.PacienteID即可到达pac.PacienteID

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM