2009-04-27 7 views
0

Может кто-нибудь помочь мне понять, как лучше всего моделировать отношения композиции?Как вы моделируете простые отношения композиции

Если, например, у меня есть студент, которого может иметь много графиков, я хотел бы создать примерно:

class Student 
{ 
    prop long Pk { get; set; } 
    prop string Name { get; set; } 
    prop List<Schedule> Schedules { get; set; } 
} 

class Schedule 
{ 
    prop string Semester { get; set; } 
    prop List<Course> Courses{ get; set; } 
} 

Где-то вниз линию я может иметь объект Schedule, и хочу, чтобы определить, какой студент принадлежит , Я хочу иметь возможность написать Schedule.Student.Name и получить имя студента взамен. Я также добавляю свойство «Студент» в свой объект «Расписание»?

Мое приложение передало Student Pk моему объекту Schedule, чтобы выполнять функции CRUD. Я сохраняю Student PK как приватную переменную, чтобы держать ее в руке, если мне это нужно.

Поскольку мое приложение становится более сложным, мне трудно поддерживать то, что я делаю. Каковы ваши предложения для меня? Что еще я могу посоветовать (книги/ссылки), чтобы получить переподготовку и лучше справиться с этими принципами?

ответ

2

«Я хочу, чтобы иметь возможность записывать Schedule.Student.Name и получать имя студента в ответ. Добавляю ли я свойство Student в свой объект Schedule?» Да.

То, что вы описываете (поддерживающее как внешние ключи для поиска, так и ссылки на объекты для удобной навигации по графу объектов), похоже на действительно хорошее соответствие объектно-реляционного картографа (ORM). Хорошая ORM автоматически загрузит связанный объект/объекты для вас с помощью FK/PK (например, если в расписании есть поле StudentPK, тогда диспетчер обработает загрузку/отображение свойства Student для вас). Существует много продуктов такого типа: вы можете использовать встроенные платформы .NET, такие как Entity Framework, с открытым исходным кодом, такие как NHibernate или коммерческие продукты, такие как LightSpeed, LLBLGen, EntitySpaces или OpenAccess (раскрытие информации: Я работаю в компании, которая делает коммерческую ОРМ). Google для ORM или объектно-реляционного картографа или для проверки Википедии, для обзора того, что я описываю.

+0

Но если добавить свойство Student к моему Schedule собственности, Что мешает мне сделать это: Student.Schedules [0] .Student.Schedules [1] .Student.Schedules [0] .Student.Schedules [0 ].Имя. Разве это не круговая ссылка? Это разрешено? – 2009-04-27 23:03:20

+0

Да, это разрешено. Это не вызывает бесконечный регресс, потому что (а) если вы создаете объекты вручную, вы будете повторно использовать объекты, которые уже существуют (например, когда вы создаете расписание, вы устанавливаете его свойство Student для существующего ученика, а не создать нового ученика) или (б), если вы используете ORM, он обнаружит, что ключ относится к существующему объекту и повторно его использует. Кроме того, по умолчанию большинство ORM будут выполнять ленивую загрузку. при создании Студента они заполняли коллекцию Schedules, когда вы ее попросите (и, наоборот, заселяете Schedule.Student, когда вы ее просите). – itowlson

 Смежные вопросы

  • Нет связанных вопросов^_^