0

This является фрагмент моего проекта базы данных, и this является фрагмент генерируется автоматически БД с помощью Fluent NHibernateссылки не-нуль свойства нулевое или транзиторное значение - понимание обратного и Cascade

И это мои объекты и классы картографии в Fluent NHibernate проекта выше DB.

Сущность:

public class BaseEntity<T> where T : BaseEntity<T> { 
    public virtual int Id { get; set; } 
... 
} 

public class Person<T> : BaseEntity<T> where T : BaseEntity<T> { 
    public virtual string FirstName { get; set; } 
    public virtual string SecondName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual string PESEL { get; set; } 
    public virtual DateTime BirthDate { get; set; } 
    public virtual string City { get; set; } 
    public virtual string PostalCode { get; set; } 
    public virtual string Street { get; set; } 
    public virtual string HouseNr { get; set; } 
    public virtual string ApartmentNr { get; set; } 
    public virtual string PhoneNr { get; set; } 
    public virtual string Email { get; set; } 
} 

public class DrivingLicense : BaseEntity<DrivingLicense> { 
    #region Relations 
    public virtual IList<DrivingLicensePermissions> DrivingLicensePermissions { get; set; } 
    public virtual Student Student { get; set; } 
    #endregion 

    public virtual DateTime IssueDate { get; set; } 
    public virtual string DrivingLicenseNr { get; set; } 
} 

public class DrivingLicensePermissions : BaseEntity<DrivingLicensePermissions> { 
    #region Relations 
    public virtual DrivingLicense DrivingLicense { get; set; } 
    #endregion 

    public virtual DrivingLicenseCategory Category { get; set; } 
} 

Отображение:

class StudentMap : ClassMap<Student> { 
    public StudentMap() { 
     Id(x => x.Id); 
     Map(x => x.FirstName).Not.Nullable().Length(25); 
     Map(x => x.SecondName).Nullable().Length(25); 
     Map(x => x.LastName).Not.Nullable().Length(50); 
     Map(x => x.PESEL).Nullable().Length(11); 
     Map(x => x.BirthDate).Not.Nullable(); 
     Map(x => x.City).Not.Nullable().Length(50); 
     Map(x => x.PostalCode).Nullable().Length(6); 
     Map(x => x.Street).Not.Nullable().Length(50); 
     Map(x => x.HouseNr).Not.Nullable().Length(10); 
     Map(x => x.ApartmentNr).Nullable().Length(10); 
     Map(x => x.PhoneNr).Nullable().Length(20); 
     Map(x => x.Email).Nullable().Length(100); 

     References(x => x.DrivingLicense).Nullable().Cascade.All(); 
     References(x => x.User).Nullable().Cascade.All(); 
     HasMany(x => x.Participants).Cascade.All(); 
    } 
} 

class DrivingLicenseMap : ClassMap<DrivingLicense> { 
    public DrivingLicenseMap() { 
     Id(x => x.Id); 
     Map(x => x.IssueDate).Not.Nullable(); 
     Map(x => x.DrivingLicenseNr).Not.Nullable().Length(20); 

     HasMany(x => x.DrivingLicensePermissions).Cascade.All(); 
     References(x => x.Student).Not.Nullable(); 
    } 
} 

class DrivingLicensePermissionsMap : ClassMap<DrivingLicensePermissions> { 
    public DrivingLicensePermissionsMap() { 
     Id(x => x.Id); 
     Map(x => x.Category).Not.Nullable(); 

     References(x => x.DrivingLicense).Not.Nullable(); 
    } 
} 

И моя проблема это исключение: не-нулевое свойство ссылается на нулевое или переходное значение Model.Entities.DrivingLicense .Student, пока я пытаюсь сохранить объект студента как этот

session.Save(student); 

, который назначен объект DrivingLicense ему это DrivingLicense свойство.

Я предполагаю, что он вызван из-за плохого сопоставления - неправильный каскад или отсутствие инверсии. Я пробовал много комбинаций и не мог заставить его работать. Также верно, что таблица Student имеет DrivingLicense_id и наоборот, DrivingLicense имеет столбец Student_id ?!

ответ

0

Чтобы решить мою проблему, мне пришлось изменить ссылку на ссылку на HasOne-to-Reference.

Теперь это выглядит так.

Сущности не изменились

Mappings:

class StudentMap : ClassMap<Student> { 
    public StudentMap() { 
     Id(x => x.Id); 
     Map(x => x.FirstName).Not.Nullable().Length(25); 
     Map(x => x.SecondName).Nullable().Length(25); 
     Map(x => x.LastName).Not.Nullable().Length(50); 
     Map(x => x.PESEL).Nullable().Length(11); 
     Map(x => x.BirthDate).Not.Nullable(); 
     Map(x => x.City).Not.Nullable().Length(50); 
     Map(x => x.PostalCode).Nullable().Length(6); 
     Map(x => x.Street).Not.Nullable().Length(50); 
     Map(x => x.HouseNr).Not.Nullable().Length(10); 
     Map(x => x.ApartmentNr).Nullable().Length(10); 
     Map(x => x.PhoneNr).Nullable().Length(20); 
     Map(x => x.Email).Nullable().Length(100); 

     HasOne(x => x.DrivingLicense).PropertyRef(x => x.Student).Cascade.All(); 
     References(x => x.User).Unique().Not.Nullable(); 
     HasMany(x => x.Participants).Cascade.All(); 
    } 
} 

class DrivingLicenseMap : ClassMap<DrivingLicense> { 
    public DrivingLicenseMap() { 
     Id(x => x.Id); 
     Map(x => x.IssueDate).Not.Nullable(); 
     Map(x => x.DrivingLicenseNr).Not.Nullable().Length(20); 

     HasMany(x => x.DrivingLicensePermissions).Cascade.All(); 
     References(x => x.Student).Unique().Not.Nullable(); 
    } 
} 

class DrivingLicensePermissionsMap : ClassMap<DrivingLicensePermissions> { 
    public DrivingLicensePermissionsMap() { 
     Id(x => x.Id); 
     Map(x => x.Category).Not.Nullable(); 

     References(x => x.DrivingLicense).Nullable(); 
    } 
} 

Благодаря этому изменению, циклическая ссылка исчезла. see it here

В таблице «Студенты» нет таблицы DrivingLicense_id, и теперь я могу сохранить учебный объект вместе с DrivingLicense и его разрешениями, просто сохранив студента, как я это делал раньше.

session.Save(student); 
0

Ключом к этой проблеме является то, что DrivingLicense ссылается на Student через карточку Not.Nullable(). Это означает, что когда NH пытается сохранить DrivingLicense, это Student не должно быть null.

Отладить код и приостановить вызов Save(student). Просмотрите график объекта, изучите studentDrivingLicense и его Student. Я предполагаю, что это null.

Вам нужно будет просмотреть аспект вашего отображения или убедиться, что граф объекта правильно «подключен» до его сохранения.

+0

Голосов за то, что они всегда удобны. Согласен с тобой.Он будет работать, если он установит ТОЛЬКО 'id'' Student' вместо установки всей Entity. Поправьте меня, если я ошибаюсь. –

+0

Несомненно. Я не думал о том, что «Студент» не является нулевым, но временным. В этом случае возникает каскадная проблема. –

+0

Похоже, [это] (http://i.imgur.com/deJNCJr.png). Нет нулевого значения. Но когда я хочу добавить ученика без DrivingLicense, в свойстве DrivingLicense для Student есть null, и при его сохранении ошибки нет. Итак, есть каскадная проблема? Но как это исправить? –

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

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