在Fluent和Nhibernate中非法访问加载集合

时间:2011-06-27 10:07:30

标签: fluent-nhibernate

我无法理解问题发生的原因。如果有任何错误,请告诉我,我对这个话题很新。

public class Department
{
    public virtual int Dept_id { get; set; }
    public virtual String Dept_name { get; set; }
    public virtual IList<Student> Students { get; set; }
    //public virtual ICollection<Student> Students { get; set; }
    public Department()
    {
        Students = new List<Student>();
    }
}
public class Student
{
    public Student()
    { 

    }
    //private int _Dept_id;
    //public virtual Guid StudentId { get; set; }
    public virtual Guid StudentId { get; set; }
    /*public virtual int Dept_id
    {
        get { return this._Dept_id; }
        set { this._Dept_id = value; }
    }*/
    public virtual int Dept_id { get; set; }
    public virtual String Name { get; set; }
    public virtual int Age { get; set; }
    public virtual String Address { get; set; }

    public virtual Department Department { get; set; }
}
public class DepartmentMap : ClassMap<Department>
{
    public DepartmentMap()
    {
        Table("Department");
        Id(x => x.Dept_id).Column("Dept_id");
        Map(x => x.Dept_name).Column("Dept_name");

        HasMany(x => x.Students).KeyColumn("Student_id").Inverse()
            .Cascade.All();

    }
}
public class StudentMap :ClassMap<Student>
{
    public StudentMap() 
    {
        Table("Student");
        Id(x => x.StudentId).Column("Student_id").GeneratedBy.GuidComb();  

        Map(x => x.Name);
        Map(x => x.Age);
        Map(x => x.Address);         

        References(x => x.Department).Column("Dept_id")
            .Not.Nullable().Not.LazyLoad();
    }
}

现在我正在尝试这段代码

[WebMethod(EnableSession = true)]
    public List<Student> Students()
    {
        IList<Student> student = new List<Student>();
        ISession session = NHibernateHelper.OpenSession();
        student = session.Query<Student>().ToList();

        return student.ToList();
    }

在将部门内的学生列表加载为

时出错
  

非法访问加载集合

此代码中缺少什么以及为什么会发生这种情况?

1 个答案:

答案 0 :(得分:2)

抱歉,我的坏!!我做了一些改变,使它工作..虽然不确定下面提到的想法的明显缺点

将学生班改为:

public class Student
{
    public Student()
    { 

    }

    public virtual Guid StudentId { get; set; }
    public virtual int Dept_id
    {
        get { return Department.Dept_id; }
        set { this.Dept_id = Department.Dept_id; }
    }

    public virtual String Name { get; set; }
    public virtual int Age { get; set; }
    public virtual String Address { get; set; }

    public virtual Department Department { get; set; }
}

和学生作为参考的映射

  

引用(x =&gt; x.Department).Column(“Dept_id”)。Cascade.All();

注意:不应该有单个部门ID映射

并将DepartmentMap更改为:

public DepartmentMap()
    {
        Table("Department");
        Id(x => x.Dept_id).Column("Dept_id");
        Map(x => x.Dept_name).Column("Dept_name");


        HasMany(x => x.Students).KeyColumn("Dept_id").AsBag();

    }