我在数据库中有两个表:Order和OrderLine。 OrderLine有一个不可为空的列(OrderId),外键指向Order.Id。
在代码中我有两个类:Order和OrderLine。 Order包含OrderLines的集合,但OrderLine没有Order的引用。
如果没有从OrderLine引用订单或维护订单ID在OrderLine中的私有字段(如this blog post (variation 3)中所示),则无法映射此关系是正确的吗?
提前致谢...
以下代码显示了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失败。
答案 0 :(得分:1)
您实际上只能在一侧映射关系,这无关紧要。
虽然在这种情况下会执行update语句。要修复异常,您只需将映射更改为
即可HasMany(x => x.OrderLines)
.AsBag()
.Cascade.AllDeleteOrphan() // or .All
.KeyColumn("OrderId")
.Not.KeyNullable();