无法初始化集合 - Fluent Nhibernate

时间:2014-07-04 13:44:58

标签: c# sql-server-2008 nhibernate fluent-nhibernate

我在处理对象集合时遇到错误

这是我的代码:

Toma.cs

public class Toma
{
    public virtual int TomaID { get; protected set; }
    public virtual DateTime FechaCarga { get; set; }
    public virtual String TipoDocumento { get; set; }
    public virtual String NroDocumento { get; set; }
    public virtual Boolean Procesada { get; set; }

    private IList<Dedo> dedos;
    public virtual IList<Dedo> Dedos 
    {
        get { return dedos; }
        protected set { dedos = value; }
    }
    private IList<Firma> firmas;
    public virtual IList<Firma> Firmas 
    {
        get { return firmas; }
        protected set { firmas = value; } 
    }
    private IList<Foto> fotos;
    public virtual IList<Foto> Fotos 
    {
        get { return fotos; }
        protected set { fotos = value; }
    }

    public Toma()
    {
        dedos = new List<Dedo>();
        firmas = new List<Firma>();
        fotos = new List<Foto>();
    }

    public virtual void MarcarComoProcesada()
    {
        this.Procesada = true;
        this.Dedos[0].Imagen = new Byte[] { 0x20 };
        this.Firmas[0].Imagen = new Byte[] { 0x20 };
        this.Fotos[0].Imagen = new Byte[] { 0x20 };
        //throw new NotImplementedException();
    }

    internal static IList<Toma> GetAll()
    {
        throw new NotImplementedException();
    }
}

Dedo.cs

public class Dedo
{
    public virtual int DedoID { get; protected set; }
    public virtual Byte[] Imagen { get; set; }
    public virtual Toma Toma { get; set; }
}

Firma.cs

public class Firma
{
    public virtual int FirmaID { get; protected set; }
    public virtual Byte[] Imagen { get; set; }
    public virtual Toma Toma { get; set; }
}

Foto.cs

public class Foto
{
    public virtual int FotoID { get; protected set; }
    public virtual Byte[] Imagen { get; set; }
    public virtual Toma Toma { get; set; }
}

我的映射:

Toma.cs

public class TomaMap : ClassMap<Toma>
{
    public TomaMap()
    {
        Table("Bio_Toma");
        Id(x=>x.TomaID).Column("TomaId");
        Map(x => x.FechaCarga);
        Map(x => x.TipoDocumento);
        Map(x => x.NroDocumento);
        Map(x => x.Procesada);
        HasMany(x => x.Dedos).Inverse().Cascade.All().KeyColumn("DedoID").Inverse();
        HasMany(x => x.Firmas).Inverse().Cascade.All().KeyColumn("FirmaID").Inverse();
        HasMany(x => x.Fotos).Inverse().Cascade.All().KeyColumn("FotoID").Inverse();
    }
}

Dedo.cs

public class DedoMap : ClassMap<Dedo>
{
    public DedoMap()
    {
        Table("Bio_Dedo");
        Id(x => x.DedoID);
        Map(x => x.Imagen);
        References(x => x.Toma).Column("TomaID");
    }
}

Firma.cs

public class FirmaMap : ClassMap<Firma>
{
    public FirmaMap()
    {
        Table("Bio_firma");
        Id(x => x.FirmaID);
        Map(x => x.Imagen);
        References(x => x.Toma).Column("TomaID");
    }
}

Foto.cs

public class FotoMap : ClassMap<Foto>
{
    public FotoMap()
    {
        Table("Bio_Foto");
        Id(x => x.FotoID);
        Map(x => x.Imagen);
        References(x => x.Toma).Column("TomaID");
    }
}

我收到错误的地方:

                foreach (Toma toma in tomas)
                {
                      ... some other things...

                    if(toma.Fotos != null)
                    {
                        foreach (Foto foto in toma.Fotos) // HERE
                            fs.Write(foto.Imagen);
                    }
                     .... more code ....
                }

审核问题并在那里提出更改无法纠正错误。 我在想是否错误是必须处理的对象数量。 &#34; Tomas&#34;对象是41k。 对于这些情况,会话对象有某种限制吗?

编辑: 例外

'NHibernate.Exceptions.GenericADOException' en NHibernate.dll

 Additional information:could not initialize a collection
 [MJYS.DGSPR.Infraestructura.Entidades.Toma.Firmas#1039][SQL: SELECT firmas0_.FirmaID
 as FirmaID1_, firmas0_.FirmaID as FirmaID1_0_, firmas0_.Imagen as Imagen1_0_,
 firmas0_.TomaID as TomaID1_0_ FROM Bio_firma firmas0_ WHERE firmas0_.FirmaID=?]

1 个答案:

答案 0 :(得分:2)

问题隐藏在对KeyColumn的误解中。如果<key column"">,则HasMany用作集合表 列的名称引用回父项表。

在我们的方案中,它很可能是 TomaID 列,因此映射应为:

HasMany(x => x.Dedos)
  //.Inverse().Cascade.All().KeyColumn("DedoID").Inverse();
  .Inverse().Cascade.All().KeyColumn("TomaID").Inverse();
HasMany(x => x.Firmas)
  //.Inverse().Cascade.All().KeyColumn("FirmaID").Inverse();
  .Inverse().Cascade.All().KeyColumn("TomaID").Inverse();
HasMany(x => x.Fotos)
  //.Inverse().Cascade.All().KeyColumn("FotoID").Inverse();
  .Inverse().Cascade.All().KeyColumn("TomaID").Inverse();

这个映射说:NHibernate,当搜索soma Tomas对象的子节点时,获取它的ID,并在目标表中搜索它 - 列TamaID。

这最终使生命圈完整,因为该列必须与我们在每个子集合实体上的逆映射中使用的相同:

...
References(x => x.Toma).Column("TomaID");