.net 一对多持久性规范不起作用
我正试图找出fluent nhibernate中以下一对多关系的持久性规范应该是什么 对不起,代码墙。。。我已经尝试了很多方法,但没有一种有效 还有谁能告诉我为什么每次不运行时都会发出第一个select?!这应该是难以置信的简单,但我已经花了几个小时在它现在,我只是准备放弃流利的NHibernate。。。写一些SQL可能会更容易.net 一对多持久性规范不起作用,.net,nhibernate,fluent,.net,Nhibernate,Fluent,我正试图找出fluent nhibernate中以下一对多关系的持久性规范应该是什么 对不起,代码墙。。。我已经尝试了很多方法,但没有一种有效 还有谁能告诉我为什么每次不运行时都会发出第一个select?!这应该是难以置信的简单,但我已经花了几个小时在它现在,我只是准备放弃流利的NHibernate。。。写一些SQL可能会更容易 public class Order { public virtual int OrderId { get; set; } private IList&
public class Order
{
public virtual int OrderId { get; set; }
private IList<Item> items = new List<Item>();
public virtual IEnumerable<Item> Items
{
get
{
return items;
}
}
public virtual void AddItem(Item item)
{
items.Add(item);
item.Order = this;
}
public virtual void RemoveItem(Item item)
{
item.Order = null;
items.Remove(item);
}
}
public class OrderMap : ClassMap<Order>
{
public OrderMap()
{
Id(x => x.OrderId).GeneratedBy.Assigned();
HasMany(x => x.Items)
.Inverse()
.Cascade.All()
.Access.CamelCaseField();
}
}
[TestClass]
public class OrderMapTest : BaseDatabaseTest
{
[TestMethod]
public void ShouldMapOrder()
{
new PersistenceSpecification<Order>(_session)
.CheckProperty(x => x.OrderId, 1)
.CheckList(x => x.Items, new List<Item>() { new Item() { Id = 1, Order = new Order() { OrderId = 1 } } })
.VerifyTheMappings();
//Test Name: ShouldMapOrder
//Test Outcome: Failed
//Result Message:
//Test method Jobs.Test.DatabaseTests.Entity.Base.OrderMapTest.ShouldMapOrder threw exception:
//NHibernate.Exceptions.GenericADOException: could not update: [Jobs.Test.DatabaseTests.Entity.Base.Item#1][SQL: UPDATE "Item" SET Order_id = ? WHERE Id = ?] ---> System.Data.SQLite.SQLiteException: constraint failed
//foreign key constraint failed
//Result StandardOutput:
//NHibernate:
// SELECT
// order_.OrderId
// FROM
// "Order" order_
// WHERE
// order_.OrderId=@p0;
// @p0 = 1 [Type: Int32 (0)]
//NHibernate:
// INSERT
// INTO
// "Item"
// (Order_id, Id)
// VALUES
// (@p0, @p1);
// @p0 = NULL [Type: Int32 (0)], @p1 = 1 [Type: Int32 (0)]
//NHibernate:
// UPDATE
// "Item"
// SET
// Order_id = @p0
// WHERE
// Id = @p1;
// @p0 = 1 [Type: Int32 (0)], @p1 = 1 [Type: Int32 (0)]
}
}
public class Item
{
public virtual int Id { get; set; }
public virtual Order Order { get; set; }
}
public class ItemMap : ClassMap<Item>
{
public ItemMap()
{
Id(x => x.Id).GeneratedBy.Assigned();
References(x => x.Order);
}
}
[TestClass]
public class ItemMapTest : BaseDatabaseTest
{
[TestMethod]
public void ShouldMapItem()
{
var Order = new Order() { OrderId = 1 };
var Item = new Item() { Id = 1 };
Order.AddItem(Item);
new PersistenceSpecification<Item>(_session, new ItemComparer())
.CheckProperty(x => x.Id, Item.Id)
.CheckReference(x => x.Order, Order)
.VerifyTheMappings();
//Test Name: ShouldMapItem
//Test Outcome: Failed
//Result Message:
//Test method Jobs.Test.DatabaseTests.Entity.Base.ItemMapTest.ShouldMapItem threw exception:
//NHibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 1, of entity: Jobs.Test.DatabaseTests.Entity.Base.Item
//Result StandardOutput:
//NHibernate:
// SELECT
// item_.Id,
// item_.Order_id as Order2_0_
// FROM
// "Item" item_
// WHERE
// item_.Id=@p0;
// @p0 = 1 [Type: Int32 (0)]
//NHibernate:
// INSERT
// INTO
// "Order"
// (OrderId)
// VALUES
// (@p0);
// @p0 = 1 [Type: Int32 (0)]
//NHibernate:
// INSERT
// INTO
// "Item"
// (Order_id, Id)
// VALUES
// (@p0, @p1);
// @p0 = 1 [Type: Int32 (0)], @p1 = 1 [Type: Int32 (0)]
}
}
我获得了ShouldMapOrder以处理以下更改:
var order = new Order{OrderId = 1};
new PersistenceSpecification<Order>(Session, new ItemComparer())
.CheckList(x => x.Items, new List<Item>() { new Item { Id = 1, Order = order } })
.VerifyTheMappings(order);
这样做允许您将项中的反向指针设置为现有顺序
为了使其正常工作,我必须向ItemMap添加一个级联:
public class ItemMap : ClassMap<Item>
{
public ItemMap()
{
Id(x => x.Id).GeneratedBy.Assigned();
References(x => x.Order).Cascade.SaveUpdate();
}
}
我必须下命令。一个设定者:
public virtual IEnumerable<Item> Items
{
get { return items; }
set { items = value.ToList(); }
}
这部分是基于对问题的回答
它正在进行选择以查看订单是否已经存在。会话中没有足够的上下文来决定是执行插入还是执行更新