Как вы делаете ограничения внешнего ключа в NHibernate? - PullRequest
0 голосов
/ 09 мая 2011

Я использую беглые nhibernate (v1.2) и nhibernate (v3.1), и у меня странная проблема.

У меня есть это

      public class GradeMap : ClassMap<Grade>
{
    public GradeMap()
    {
        Id(x => x.GradeId);
        Map(x => x.TaskName).NvarcharWithMaxSize().Not.Nullable();
        Map(x => x.Weight).Not.Nullable().Precision(5).Scale(2);
        Map(x => x.OutOf).Not.Nullable().Precision(5).Scale(2);
        Map(x => x.Mark).Not.Nullable().Precision(5).Scale(2);
        Map(x => x.CourseBackgroundColor).Not.Nullable();
        Map(x => x.CoursePrefix).Not.Nullable();
        References(x => x.Student).Not.Nullable();
        References(x => x.Course);
    }
}

public class CourseMap : ClassMap<Course>
{
    public CourseMap()
    {

        Id(x => x.Id).Column("CourseId");
        Map(x => x.Prefix).NvarcharWithMaxSize().Not.Nullable();
        HasMany(x => x.Tasks).Cascade.Delete().Inverse();
        HasMany(x => x.CoursePermissions).Cascade.All().Inverse();
        HasMany(x => x.CourseSharing).Cascade.All().Inverse();
        HasMany(x => x.Grades).Cascade.None().Inverse();
    }
}

Затем я что-то делаювот так

return session.Query<Grade>().ToList();

Если бы я попытался схватить такое пророчество, как Grade.Course.Id, он бы потерпел крах, и я бы получил.или ноль.Не то чтобы у него был какой-нибудь прокси со всеми свойствами, генерирующими исключения.

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

Я нашел это сообщение, но у меня больше нет этого атрибута, поэтому, возможно, они избавилисьили переместил его.

Кто-нибудь знает?

Можно ли избежать NHibernate.ObjectNotFoundException, когда существует внешний ключ, но ссылка на строку не существует?

Ответы [ 2 ]

1 голос
/ 09 мая 2011

I думаю ошибка здесь в том, что вы получаете доступ к свойству Id объекта, который не существует.
Вы получаете ту же ошибку, если вы делаете TableA.TableB?

0 голосов
/ 14 мая 2011

А как насчет NotFound.Ignore ()?

public class GradeMap : ClassMap<Grade>
{
    public GradeMap()
    {
        Id(x => x.GradeId);
        Map(x => x.TaskName).NvarcharWithMaxSize().Not.Nullable();
        Map(x => x.Weight).Not.Nullable().Precision(5).Scale(2);
        Map(x => x.OutOf).Not.Nullable().Precision(5).Scale(2);
        Map(x => x.Mark).Not.Nullable().Precision(5).Scale(2);
        Map(x => x.CourseBackgroundColor).Not.Nullable();
        Map(x => x.CoursePrefix).Not.Nullable();
        References(x => x.Student).Not.Nullable();
        References(x => x.Course)
            .NotFound.Ignore();
    }
}

EDIT: Допустим, схема базы данных выглядит следующим образом:

Grade(GradeId, TaskName, Course_id)
Course(CourseId, Prefix)

Если для столбца Course_id нет ограничения по внешнему ключу, можно удалить строку в таблице Course с CourseId, которая соответствует столбцу Course_id в таблице оценок. E.g.:

Course table:
CourseId    Prefix
1           Course1Prefix

Grade table:
GradeId     TaskName    Course_id
1           Grade1Task  1

без ограничения внешнего ключа вы можете выполнить этот dml-запрос:

delete from Course where CourseId = 1

И это может быть причиной проблемы, объясненной sJhonny.

Когда в отображении используется «NotFound.Ignore ()», NHibernate пытается загрузить курсы, принадлежащие всем классам, которые были загружены запросом:

session.Query<Grade>().ToList();

Прокси не генерируются, и если курс, на который ссылается оценка, не найден в базе данных, свойство Course просто равно нулю.

Если вы можете изменить схему базы данных, было бы полезно создать ограничение PK для столбца Course_id.

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