オブジェクトのコレクションを処理するときにエラーが発生します
これが私のコードです:
Take.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();
}
}
Finger.cs
public class Dedo
{
public virtual int DedoID { get; protected set; }
public virtual Byte[] Imagen { get; set; }
public virtual Toma Toma { get; set; }
}
Company.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; }
}
私のマッピング:
Take.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();
}
}
Finger.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");
}
}
Company.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 ....
}
質問を確認し、そこで提案された変更を加えると、エラーを修正できませんでした。エラーが処理しなければならないオブジェクトの数であるかどうかを考えています。「トーマス」オブジェクトの数は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=?]
問題は、の誤解に隠されてい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");
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加