Как должны работать отношения Fluent Nhibernate Reference / HasMany? - PullRequest
0 голосов
/ 19 марта 2012

У меня есть две таблицы настройки со ссылкой и отношением hasmany.Когда Xref.SaveOrUpdate () вызывается, «Неверный индекс 7 для этой коллекции SqlParameterCollection с счетом = 7».исключение брошено.У меня такое ощущение, что я неправильно настраиваю HasMany и References.Что я должен делать по-другому?

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

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Вы отображаете один и тот же столбец дважды в своем отображении выше. Именно это обычно вызывает ошибку Invalid index 7 for this SqlParameterCollection with Count=7.

Вот пример того, где вы делаете это:

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

Вы не должны делать Map(x => x.LoginRno)

0 голосов
/ 19 марта 2012

Login.SaveOrUpdate (s);// сохранить или обновить временный объект входа со всеми ссылочными объектами

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