C# Fluent NHibernate有许多保存插入空值

C# Fluent NHibernate有许多保存插入空值,c#,nhibernate,fluent-nhibernate,nhibernate-mapping,C#,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我是nhibernate的新手,所以可能我的反应取决于我缺乏知识 我创建了这两个表: (对意大利语感到抱歉,我希望你能理解而没有任何问题) 然后,我的模型中有以下对象: [Serializable] public class Profilo { public virtual int Id { get; set; } public virtual string Matricola { get; set; } public virtual string Ruolo { g

我是nhibernate的新手,所以可能我的反应取决于我缺乏知识

我创建了这两个表:

(对意大利语感到抱歉,我希望你能理解而没有任何问题)

然后,我的模型中有以下对象:


[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; }
}

这是我使用fluent 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邮件列表中的某个地方读到了这一点,这很正常,因为nhibernate首先插入空值,然后使用列表属性中包含的正确值更新相同的记录

是这样吗? 我犯了什么错误吗

我希望澄清一下情况。 thx家伙

ps:我正在使用Nhibernate 2.1和fluent 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上循环(它插入此列表的最后一个元素)


有什么想法吗?

KeyColumns映射只应用于多对一连接中的子表

如果您想建立连接,您需要使用
TBA\u公文包
表中的Id列,并从
TBA\u Sede
中引用它

大概是这样的:

Tba_投资组合 Id | matricola | ruolo

Tba_sede
Id | PorfolioId | descripione

您的映射错误,请尝试以下操作:

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

    }

}

关键是,您需要父profilio来保存其子项。让子项对其父项不做任何操作。另外,您的表格图表看起来是错误的,profolio不应该有sede的键,但是sede应该有一个fk到profolio。

此外,我通过编写保存实体的方法编辑了我的帖子。我理解您的意思,但这种情况与我的不同。我能理解为什么nhibernate没有正确填写TBA_Profilo.codice_sede:(自从我开始绘制地图以来,它持续了很多时间。我真的不知道这是否是正确的解决方案。无论如何,谢谢你的回答;)