【问题标题】:nHibernate one-to-many best practice persintence to avoid INSERT NULLnHibernate 一对多最佳实践持久性以避免 INSERT NULL
【发布时间】:2012-07-16 19:11:13
【问题描述】:

我有一个一对多映射。 一个实体有一个集合持久化在两个表1上:N

这是类和映射:

public class Test
    {
        public virtual string Id { get; set; }
        public virtual string Description { get; set; }
        public virtual IList<TestItem> Items { get; set; }

        public Test()
        {
            Items = new List<TestItem>();
        }
    }

    public class TestItem
    {
        public virtual string Id { get; set; }
        public virtual Test Test { get; set; }
        public virtual string ItemCode { get; set; }
        public virtual string ItemData { get; set; }
    }

    public class TestMap : ClassMapping<Test>
    {
        public TestMap()
        {
            Id(x => x.Id, m => m.Column("IDTest"));

            Bag(x => x.Items, c =>
            {
                c.Key(k =>
                {
                    k.NotNullable(true);
                    k.Column("IDTest");
                });
                c.Cascade(Cascade.DeleteOrphans);
                c.Lazy(CollectionLazy.NoLazy);
                c.Inverse(true);
            }, r => r.OneToMany(m =>
            {
                m.NotFound(NotFoundMode.Exception);
                m.Class(typeof(TestItem));
            }));
        }
    }

    public class TestItemMap : ClassMapping<TestItem>
    {
        public TestItemMap()
        {
            Id(x => x.Id, m => m.Column("IDTestItem"));

            ManyToOne(x => x.Test, m =>
            {
                m.Column("IDTest");
                m.NotNullable(false);
                m.Lazy(LazyRelation.NoLazy);
            });

            Property(x => x.ItemCode);
            Property(x => x.ItemData);
        }
    }

这是代码。 如果我删除标记的行,我会收到错误。

var session = SessionFactory.OpenSession();

            using (var tr = session.BeginTransaction())
            {
                var test = new Test();
                test.Id = "T01";
                test.Description = "Desc TEST 01";

                session.SaveOrUpdate(test); // If Removed Get INSERT ERROR on TestItem

                var item = new TestItem { Id = "NEW01", ItemCode = "A", Test = test, ItemData = "New T01A" };
                test.Items.Add(item);
                session.SaveOrUpdate(item);

                session.SaveOrUpdate(test);

                tr.Commit();
            }

我的问题是:

这是保持“一对多”关系的最佳做法吗?

可以使用下面的代码全部保存,只保存表头Row(测试),自动级联子表上的所有插入??

var session = SessionFactory.OpenSession();

            using (var tr = session.BeginTransaction())
            {
                var test = new Test();
                test.Id = "T01";
                test.Description = "Desc TEST 01";

                //session.SaveOrUpdate(test); // If Removed Get INSERT ERROR on TestItem

                var item = new TestItem { Id = "NEW01", ItemCode = "A", Test = test, ItemData = "New T01A" };
                test.Items.Add(item);
                //session.SaveOrUpdate(item);

                session.SaveOrUpdate(test);

                tr.Commit();
            }

我想我需要更改我的映射代码,但我不明白是什么!!!

很多天的工作,谷歌搜索,stackoverflow,但没有任何改变结果。

谢谢!!!

【问题讨论】:

    标签: nhibernate mapping one-to-many cascade


    【解决方案1】:

    问:这是保持“一对多”关系的最佳做法吗?

    答:如果您谈论的是“composition”关系,级联方法可能是一个不错的选择。

    问:是否可以使用下面的代码全部保存,只保存表头Row(测试),自动级联子表上的所有插入??

    A:是的,这是可能的。但是您的代码应如下所示:

    public class TestMap : ClassMapping<Test>
    {
        public TestMap()
        {
            Id(x => x.Id, m => m.Column("IDTest"));
    
            Bag(x => x.Items, c =>
            {
                c.Key(k =>
                {
                    k.NotNullable(true);
                    k.Column("IDTest");
                });
                c.Cascade(Cascade.All | Cascade.DeleteOrphans); //<- My suggestion
                c.Lazy(CollectionLazy.NoLazy);
                c.Inverse(true);
            }, r => r.OneToMany(m =>
            {
                m.NotFound(NotFoundMode.Exception);
                m.Class(typeof(TestItem));
            }));
        }
    }
    

    【讨论】:

    • 你省了!!!!我爱你!!!谢谢!!! OR的mistic力量!!!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2018-09-17
    • 2011-08-13
    • 2014-09-11
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多