Получение записей от многих до многих беглых nhibernate? - PullRequest
0 голосов
/ 31 января 2011

Я установил отношения многие ко многим, следуя беглому nhibernate Учебник по началу работы .

http://wiki.fluentnhibernate.org/images/2/24/FirstProjectSchema.png

Теперь я не уверен, как получить данные. Например, что произойдет, если я захочу получить все товары, которые есть в магазине.

Так что мне нужно будет использовать storeId на столе продуктов. Однако в таблице products нет storeId, и у меня нет класса, который на самом деле содержит сопоставления или свойства для StoreProduct.

Так что я не могу пойти

session.Query<StoreProduct>().Where(x => x.StoreId == "1").toList();

Так что мне нужно сделать объединение в Магазине и Продуктах, а затем сделать запрос по ним?

Редактировать

Вот разбавленная версия того, что у меня есть.

      public class Student
        {
            public virtual Guid StudentId { get; private set; }
            public virtual IList<Course> Courses { get; set; }
            public virtual IList<Permission> Permissions{get; set;}


            public Student()
            {
               Courses = new List<Course>();
               Permissions = new List<Permission>();
            }

     public class StudentMap : ClassMap<Student>
        {
            public StudentMap()
            {
                Table("Students"); 
                Id(x => x.StudentId).Column("StudentId");
                HasManyToMany(x => x.Permissions).Table("PermissionLevel");
                HasManyToMany(x => x.Courses).Table("PermissionLevel");
            }
        }

  public class CourseMap : ClassMap<Course>
    {
        public CourseMap()
        {
            Table("Courses");
            Id(x => x.CourseId).Column("CourseId");
            HasManyToMany(x => x.Permissions ).Table("PermissionLevel");
            HasManyToMany(x => x.Students).Table("PermissionLevel");
        }
    }

    public class Course
    {
        public virtual int CourseId { get; private set; }
        public virtual IList<Permission> Permissions { get; set; }
        public virtual IList<Student> Students { get; set; }


        public Course()
        {
            Permissions = new List<Permission>();
            Students = new List<Student>();
        }
    }

  public class PermissionMap : ClassMap<Permission>
    {
        public PermissionMap()
        {
            Table("Permissions");
            Id(x => x.PermissionId).Column("PermissionId");
            HasManyToMany(x => x.Students).Table("PermissionLevel");
        }
    }

 public class Permission
    {
        public virtual int PermissionId { get; private set; }
        public virtual IList<Student> Students {get; set;}

        public Permission()
        {
            Students = new List<Student>();
        }
    }


 var a = session.Query<Student>().Where(x => x.Email == email).FirstOrDefault();
            var b = session.Get<Student>(a.StudentId).Courses;

ошибка, которую я получаю, когда смотрю в b.

не удалось инициализировать коллекцию: [Student.Courses # 757f27a2-e997-44f8-b2c2-6c0fd6ee2c2f] [SQL: ВЫБРАТЬ course0_.Student_id как Student3_1_, courses0_.Course_id as Course1_1_, course1_.CourseId as CourseId2_0_, course1_.Prefix as Prefix2_0_, course1_.BackgroundColor as Backgrou3_2_0_ FROM PermissionLevel курсы0_ оставил внешнее соединение Курсы Course1_ on courses0_.Course_id = course1_.CourseId ГДЕ courses0_.Student_id =?] "

Ответы [ 2 ]

1 голос
/ 31 января 2011

Нет, нет.StoreProduct - это специальный стол, в котором хранятся отношения «многие ко многим» между магазином и продуктами.NHibernate может заполнять коллекцию продуктов Store автоматически, используя эту таблицу.Это должно быть описано в картографии.Вы должны сделать запрос так:

var storeProducts = session.Get<Store>(1).Products;

Вот сопоставление для Store:

public class StoreMap : ClassMap<Store>
{
  public StoreMap()
  {
    Id(x => x.Id);
    Map(x => x.Name);
    HasMany(x => x.Staff)
      .Inverse()
      .Cascade.All();
    HasManyToMany(x => x.Products)
     .Cascade.All()
     .Table("StoreProduct");
  }
}

Строка уведомлений HasManyToMany(x => x.Products) и .Table("StoreProduct") говорят NHibernate использовать таблицу StoreProduct как источник для объектов хранилища отношений "многие ко многим" в коллекции Продукты .

0 голосов
/ 01 февраля 2011

У вас неправильные отображения для ученика:

HasManyToMany(x => x.Permissions).Table("PermissionLevel");
HasManyToMany(x => x.Courses).Table("PermissionLevel");

Должно быть следующее:

HasManyToMany(x => x.Courses).Table("StudentCourses");

А у вас, студент, класс неполный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...