Я новичок в nhibernate, поэтому, возможно, ответ зависит от моего недостатка знаний.
Я создал эти две таблицы: ![alt text](https://i.stack.imgur.com/DA3kn.png)
(извините за итальянский язык, я надеюсь, что выможет понять без каких-либо проблем).
Затем, у меня есть эти объекты в моей модели:
[Serializable]
public class Profilo
{
public virtual int Id { get; set; }
public virtual string Matricola { get; set; }
public virtual string Ruolo { get; set; }
public virtual IList ListaSedi { get; set; }
public Profilo()
{
ListaSedi = new List();
}
}
[Serializable]
public class Sede
{
public virtual string CodiceSede { get; set; }
public virtual string DescrizioneSede { get; set; }
public virtual Profilo Profilo { get; set; }
}
Это способ, которым я отобразил сущности, используя беглый nhibernate:
public class Map_Sede : FluentNHibernate.Mapping.ClassMap
{
public Map_Sede()
{
Table("TBA_Sede");
Id(x => x.CodiceSede).Column("codice_sede").GeneratedBy.Assigned();
Map(x => x.DescrizioneSede)
.Column("descrizione");
References(prof => prof.Profilo)
.Column("codice_sede");
}
}
public class Map_Profilo : FluentNHibernate.Mapping.ClassMap
{
public Map_Profilo()
{
Table("TBA_Profilo");
Id(x => x.Id).Column("id").GeneratedBy.Identity();
Map(x => x.Matricola)
.Column("matricola");
Map(x => x.Ruolo)
.Column("ruolo");
HasMany(x => x.ListaSedi)
.AsBag()
.KeyColumns.Add("codice_sede")
.Not.LazyLoad()
.Cascade.None();
}
}
Теперь я хотел бы вставить новый экземпляр Profilo в мой.Кажется, все работает, но nhibernate не вставляет значения в столбец TBA_Profilo.codice_sede.Я заметил, что оператор вставки состоит из двух параметров (matricola, ruolo) - почему он забывает третий параметр?
Я читаю где-то (в списке рассылки nhibernate), что вполне нормально, потому что nhiberate вставляет значения с нулемсначала обновите те же записи правильными значениями, содержащимися в свойстве списка.
Это правильно?Я делаю какие-либо ошибки?
Я надеюсь прояснить ситуацию.спасибо, ребята
ps: я использую Nhibernate 2.1 и свободно использую nhibernate 1.1
UPDATE : это код, который я использую для сохранения сущности.
var sesionFactory = NHibernateHelper.createSessionFactory();
using (NHibernate.ISession session = sesionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
try
{
session.SaveOrUpdate(entity);
transaction.Commit();
session.Flush();
}
catch (Exception)
{
transaction.Rollback();
throw;
}
finally
{
transaction.Dispose();
}
}
}
ОБНОВЛЕНИЕ 2 : Следуя хитрому ответу, я немного изменил свое решение.Это новые сущности модели:
[Serializable]
public class Profilo
{
public virtual int Id { get; set; }
public virtual string Matricola { get; set; }
public virtual string Ruolo { get; set; }
public virtual IList ListaSedi { get; set; }
public Profilo()
{
ListaSedi = new List();
}
}
[Serializable]
public class Sede
{
public virtual string CodiceSede { get; set; }
public virtual string DescrizioneSede { get; set; }
public virtual IList ProfiliAssociati { get; set; }
}
И новые сопоставления:
public class Map_Sede : FluentNHibernate.Mapping.ClassMap
{
public Map_Sede()
{
Table("TBA_Sede");
Id(x => x.CodiceSede).Column("codice_sede").GeneratedBy.Assigned();
Map(x => x.DescrizioneSede)
.Column("descrizione");
HasMany(x => x.ProfiliAssociati)
.AsBag()
.KeyColumns.Add("codice_sede")
.Cascade.All();
}
}
public class Map_Profilo : FluentNHibernate.Mapping.ClassMap
{
public Map_Profilo()
{
Table("TBA_Profilo");
Id(x => x.Id).Column("id").GeneratedBy.Identity();
Map(x => x.Matricola)
.Column("matricola");
Map(x => x.Ruolo)
.Column("ruolo");
HasMany(x => x.ListaSedi)
.AsBag()
.Inverse()
.KeyColumns.Add("codice_sede")
.Cascade.SaveUpdate();
}
}
Теперь, похоже, все работает: я имею в виду, что nhibernate может писать столбец TBA_Profilo.codice_sede, даже если он не 'В Profilo.IList (вставляется последний элемент этого списка).
Есть идеи?