我在数据库中有两个表: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”中;列不允许空值。插入失败。