2012-03-19 7 views
0

私は参照とhasmany関係で2つのテーブルを設定しました。 Xref.SaveOrUpdate()が "このSqlParameterCollectionのCount = 7で無効なインデックス7"と呼ばれる場合例外がスローされます。私はHasManyとReferencesを正しく設定していないと感じています。私は何をすべきですか?Fluent Nhibernate Reference/HasMany関係はどのように動作するはずですか?

public class PortalPhysicianMap : ClassMap<PortalPhysician> 
{ 
    public PortalPhysicianMap() 
    { 
     Table("PortalPhysicians"); 
     Id(x => x.PhysicianRno).GeneratedBy.Identity(); 
     Map(x => x.A1PhysicianRno); 
     Map(x => x.LastName); 
     Map(x => x.FirstName); 
     Map(x => x.TitleName); 
     Map(x => x.SuffixName); 
     Map(x => x.CorrName); 
     Map(x => x.Specialty); 
     Map(x => x.Institution); 
     Map(x => x.Addr1); 
     Map(x => x.Addr2); 
     Map(x => x.City); 
     Map(x => x.State); 
     Map(x => x.PostalCode); 
     Map(x => x.Country); 
     Map(x => x.Phone); 
     Map(x => x.Fax); 
     Map(x => x.InactiveDt); 
     Map(x => x.CreatedDate, "CreatedDt"); 
     Map(x => x.UpdatedDate, "UpdatedDt"); 

     HasMany(x => x.Xrefs) 
      .KeyColumn("A1PhysicianRno"); 
      //.Cascade.All(); 
    } 
} 

public class PortalLoginPhyXrefMap : ClassMap<PortalLoginPhyXref> 
{ 
    public PortalLoginPhyXrefMap() 
    { 
     Table("PortalLoginPhyXref"); 
     Id(x => x.XrefRno).GeneratedBy.Identity(); 
     Map(x => x.LoginRno); 
     Map(x => x.A1PhysicianRno); 
     Map(x => x.UserName); 
     Map(x => x.UserRole); 
     Map(x => x.InactiveDt); 
     Map(x => x.CreatedDate, "CreatedDt"); 
     Map(x => x.UpdatedDate, "UpdatedDt"); 

     References<PortalPhysician>(x => x.Login) 
      .Column("LoginRno"); 
    } 
} 



using (ISession s = Env.dbPortal.OpenSession()) 
{ 
    try 
    { 
     using (ITransaction Trans = s.BeginTransaction()) 
     { 
      Trans.Begin(); 

      foreach (PortalLogin Login in lstLogins) 
      { 
       if (Login.UserName != null) 
       { 
        Login.SaveOrUpdate(s); 

        foreach (PortalLoginPhyXref Xref in Login.Xrefs) 
        { 
         Xref.LoginRno = Login.LoginRno; 
         Xref.SaveOrUpdate(s); 
        } 
       } 
      } 

      Trans.Commit(); 
     } 
    } 
    catch (Exception Ex) 
    { 
     frmError.Show(Ex); 
    } 
} 

するsaveOrUpdate(に何が起こるかを示す追加コード)

public class PortalLoginPhyXref : BaseRec 
{ 
    public virtual void SaveOrUpdate(ISession Sess) 
    { 
     base.SaveOrUpdate(Sess, XrefRno); 
    } 
} 


public abstract class BaseRec 
{ 
    public virtual DateTime CreatedDate { get; set; } 
    public virtual string CreatedUserID { get; set; } 
    public virtual DateTime? UpdatedDate { get; set; } 
    public virtual string UpdatedUserID { get; set; } 

    public virtual void SaveOrUpdate(ISession Sess, int Rno) 
    { 
     SaveOrUpdate(Sess, (Rno == 0)); 
    } 

    public virtual void SaveOrUpdate(ISession Sess, string ID) 
    { 
     SaveOrUpdate(Sess, (ID == null)); 
    } 

    private void SaveOrUpdate(ISession Sess, bool Save) 
    { 
     if (Save) 
     { 
      CreatedDate = DateTime.Now; 
      CreatedUserID = Env.UserID; 
     } 
     UpdatedDate = DateTime.Now; 
     UpdatedUserID = Env.UserID; 

     Sess.SaveOrUpdate(this); 
    } 
} 
+0

を行うべきではありませんか?あなたはコードの例を挙げることができますか? – Anton

+0

私はSaveOrUpdate()にコードを追加しました。 –

答えて

1

上記のマッピングで同じ列を2回マッピングしています。そのため、一般的にはInvalid index 7 for this SqlParameterCollection with Count=7エラーが発生します。ここで

は、あなたがこれをやっているところの例です:

Map(x => x.LoginRno); 
References<PortalPhysician>(x => x.Login) 
     .Column("LoginRno"); 

あなたはLogin.SaveOrUpdate( "ISession")の内部で行うのは何Map(x => x.LoginRno)

0

Login.SaveOrUpdate(S); //一時オブジェクトをすべての参照オブジェクトで保存または更新する

foreach (PortalLoginPhyXref Xref in Login.Xrefs) 
       { 
        Xref.LoginRno = Login.LoginRno; 
        // Xref.SaveOrUpdate(s); // They'll update when you close transaction. 
       } 
関連する問題