Неправильный SQL генерируется с помощью fluent nhibernate, когда таблицы имеют отношение «один ко многим»

#nhibernate #fluent-nhibernate #nhibernate-mapping #oracle11g

#nhibernate #fluent-nhibernate #nhibernate-сопоставление #oracle11g

Вопрос:

У меня есть две таблицы, одна UserDetails, а другая UserRoles. Я сопоставил их следующим образом. С этой операцией вставки все прошло нормально, но когда я пытаюсь получить список ролей из пользовательского объекта, возникает исключение. Я определил, что SQL, сгенерированный Hibernate, имеет столбец USERCODE в качестве User_id в предложении whare. Как преодолеть эту проблему. Пожалуйста, помогите мне.

Пользовательский класс:

 public virtual string Code { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string MiddleName { get; set; }
    .......
    public virtual IList<UserRole> Roles { get; set; }
    public virtual IList<UserResource> Resources { get; set; }
  

Карта пользователя:

  Table("USER_DETAILS");
        Schema("PROJECTDOCS");
        Id(x => x.Code).Column("CODE").GeneratedBy.Assigned();
        Map(x => x.FirstName).Column("FIRSTNAME").Not.Nullable().Length(100);
        Map(x => x.LastName).Column("LASTNAME").Length(100).Not.Nullable();
        Map(x => x.MiddleName).Column("MIDDLENAME").Length(100);
        ...
        HasMany(x => x.Roles).Inverse().Cascade.All();
  

Класс UserRole:

  public virtual long UserRoleID { get; set; }
    public virtual User UserCode { get; set; }
    public virtual long RoleID { get; set; }
    public virtual string CreatedBy { get; set; }
    public virtual DateTime CreatedDate { get; set; }
    public virtual string UpdatedBy { get; set; }
    public virtual DateTime UpdatedDate { get; set; }
  

Карта ролей пользователя:

 Table("USER_ROLES");
        Schema("PROJECTDOCS");
        Id(x => x.UserRoleID).Column("URID").GeneratedBy.Increment();
        Map(x => x.RoleID).Column("ROLEID").Not.Nullable();
        Map(x => x.CreatedBy).Column("CREATEDBY").Not.Nullable().Length(36);
        Map(x => x.CreatedDate).Column("CREATEDDATE").Not.Nullable().Default(DateTime.Now.ToString());
        Map(x => x.UpdatedBy).Column("UPDATEDBY").Not.Nullable().Length(36);
        Map(x => x.UpdatedDate).Column("UPDATEDDATE").Not.Nullable().Default(DateTime.Now.ToString());
        References(x => x.UserCode).Column("USERCODE");           
  

Окончательный сгенерированный SQL был:

[SQL: ВЫБЕРИТЕ roles0_.User_id как User8_1_, roles0_.URID как URID1_, roles0_.URID как URID2_0_, roles0_.ROLEID как ROLEID2_0_, roles0_.CREATEDBY как CREATEDBY2_0_, roles0_.CREATEDDATE как CREATEDD4_2_0_, roles0_.UPDATEDBY как UPDATEDBY2_0_, roles0_.ДАТА ОБНОВЛЕНИЯ как UPDATEDD6_2_0_, roles0_.ПОЛЬЗОВАТЕЛЬСКИЙ код как USERCODE2_0_ ИЗ PROJECTDOCS.USER_ROLES roles0_, ГДЕ roles0_.User_id=?]

Имя столбца, выделенное жирным шрифтом, — это то, что происходит.

Заранее спасибо, Pradeep

Ответ №1:

Похоже, вам не хватает ключевого столбца в вашем hasMany to UserRoles в вашем UserClass. Вероятно, вам нужно сделать это:

 HasMany(x => x.Roles).KeyColumn("URID").Inverse().Cascade.All();