Nhibernate中的父子映射

时间:2013-10-05 15:28:38

标签: nhibernate orm nhibernate-mapping

我在数据库中有两个表:Order和OrderLine。 OrderLine有一个可为空的列(OrderId),外键指向Order.Id。

在代码中我有两个类:Order和OrderLine。 Order包含OrderLines的集合,但OrderLine没有Order的引用。

如果没有从OrderLine引用订单或维护订单ID在OrderLine中的私有字段(如this blog post (variation 3)中所示),则无法映射此关系是正确的吗?

提前致谢...

enter image description here

以下代码显示了enties和mappings

namespace NhibernateMappingTests
{
    [TestClass]
    public class MappingExample2
    {
        [TestMethod]
        public void InsertTest()
        {
            using (var session = NHibernateHelper.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    Order order = new Order();
                    order.AddOrderLine(new OrderLine());
                    session.Save(order);
                    transaction.Commit();
                }
            }
        }
    }

    public class Order
    {
        public Order()
        {
            OrderLines = new List<OrderLine>();
        }

        public int Id { get; set; }
        public IList<OrderLine> OrderLines { get; set; }

        public void AddOrderLine(OrderLine orderLine)
        {
            OrderLines.Add(orderLine);
        }
    }

    public class OrderLine
    {
        public int Id { get; set; }
    }

    public class OrderMap : ClassMap<Order>
    {
        public OrderMap()
        {
            Not.LazyLoad();
            Id(x => x.Id).GeneratedBy.Identity();
            HasMany(x => x.OrderLines)
                .AsBag()
                .Cascade.All()
                .KeyColumn("OrderId");
        }
    }

    public class OrderLineMap : ClassMap<OrderLine>
    {
        public OrderLineMap()
        {
            Not.LazyLoad();
            Id(x => x.Id).GeneratedBy.Identity();
        }
    }

    public class NHibernateHelper
    {
        private static ISessionFactory _sessionFactory;

        private static ISessionFactory SessionFactory
        {
            get
            {
                if (_sessionFactory == null)
                    InitializeSessionFactory();

                return _sessionFactory;
            }
        }

        private static void InitializeSessionFactory()
        {
            _sessionFactory = Fluently.Configure()
                .Database(MsSqlConfiguration.MsSql2008.ConnectionString(@"data source=(local)\db01;initial catalog=MyDatabase;persist security info=false;packet size=4096;integrated security=sspi;").ShowSql())
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<TimeSeries>())
                //.ExposeConfiguration(cfg => new SchemaExport(cfg).Create(true, true))
                .BuildSessionFactory();
        }

        public static ISession OpenSession()
        {
            return SessionFactory.OpenSession();
        }
    }
}

导致以下异常:

测试方法NhibernateMappingTests.MappingExample2.InsertTest抛出异常: NHibernate.Exceptions.GenericADOException:无法插入:[NhibernateMappingTests.OrderLine] [SQL:INSERT INTO [OrderLine] DEFAULT VALUES;选择SCOPE_IDENTITY()] ---&gt; System.Data.SqlClient.SqlException:无法将值NULL插入到'OrderId'列中,表'MyDatabase.dbo.OrderLine';列不允许空值。 INSERT失败。

1 个答案:

答案 0 :(得分:1)

您实际上只能在一侧映射关系,这无关紧要。

虽然在这种情况下会执行update语句。要修复异常,您只需将映射更改为

即可
HasMany(x => x.OrderLines) 
  .AsBag() 
  .Cascade.AllDeleteOrphan() // or .All
   .KeyColumn("OrderId")
   .Not.KeyNullable();