Свободный NHibernate hasmany сохранить вставить нулевое значение - PullRequest
0 голосов
/ 22 сентября 2010

Я новичок в nhibernate, поэтому, возможно, ответ зависит от моего недостатка знаний.

Я создал эти две таблицы: alt text

(извините за итальянский язык, я надеюсь, что выможет понять без каких-либо проблем).

Затем, у меня есть эти объекты в моей модели:


[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 (вставляется последний элемент этого списка).

Есть идеи?

Ответы [ 2 ]

1 голос
/ 22 сентября 2010

Отображение KeyColumns применяется только к дочерней таблице в соединении многие-к-одному.

Если вы хотите установить соединение, вам нужно использовать столбец Id из таблицы TBA_portfolio и ссылаться на него из TBA_Sede.

Примерно так:

Tba_portfolio Id | matricola | ruolo

Tba_sede Id | PorfolioId | Descrizione

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

Ваше отображение неверно, попробуйте это:

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.SaveUpdate();

        }
    }

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")
            .Cascade.None()
            .Inverse();

    }

}

Ключ в том, что вам нужен родительский профиль для сохранения дочерних элементов. Пусть дочерние элементы ничего не делают со своим родителем. Кроме того, ваша диаграмма таблицы выглядит неправильно, у profolio не должно быть ключа для sede, но у sede должен быть fk to profolio.

...