0

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

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

如果不引入从 OrderLine 到 Order 的引用或在 OrderLine 内维护一个带有订单 ID 的私有字段,如本博文(变体 3)所示,您不能映射此关系是否正确?

提前致谢…

在此处输入图像描述

以下代码显示了实体和映射

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] 默认值;选择 SCOPE_IDENTITY()] ---> System.Data.SqlClient.SqlException:无法将值 NULL 插入到列“OrderId”、表“MyDatabase.dbo.OrderLine”中;列不允许空值。插入失败。

4

1 回答 1

1

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

尽管在这种情况下将执行更新语句。要修复异常,您只需将映射更改为

HasMany(x => x.OrderLines) 
  .AsBag() 
  .Cascade.AllDeleteOrphan() // or .All
   .KeyColumn("OrderId")
   .Not.KeyNullable();
于 2013-10-05T15:48:36.863 回答