簡體   English   中英

流利的NHibernate hasmany保存插入空值

[英]Fluent NHibernate hasmany save insert null value

我剛進入休眠狀態,所以響應可能取決於我缺乏知識。

我創建了這兩個表: 替代文字

(對不起,意大利語,我希望您能毫無問題地理解)。

然后,我在模型中有這些對象:


[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列上插入值。 我注意到insert語句由兩個參數(matricola,ruolo)組成-為什么它忘記了第三個參數?

我在某個地方(在nhibernate郵件列表上)讀了一個很普通的書,因為它首先將nhiberate插入值設置為null,然后使用list屬性中包含的正確值更新相同的記錄。

這樣對嗎? 我有什么錯誤嗎?

我希望已經澄清了這種情況。 謝謝你們

ps:我正在使用Nhibernate 2.1和流利的nhibernate 1.1

更新 :這是我用來保存實體的代碼。


                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上顯示(它會插入此List的最后一個元素)。

有任何想法嗎?

KeyColumns映射僅在多對一連接中應用子表。

如果你想有連接,您將需要從使用ID列TBA_portfolio表和引用它TBA_Sede

像這樣:

Tba_portfolio ID | matricola | ruolo

Tba_sede ID | PorfolioId | descrizione

您的映射錯誤,請嘗試以下操作:

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應該沒有密鑰要seed,但是sede應該有一個fk來保護profolio。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM