.net 一对多持久性规范不起作用

.net 一对多持久性规范不起作用,.net,nhibernate,fluent,.net,Nhibernate,Fluent,我正试图找出fluent nhibernate中以下一对多关系的持久性规范应该是什么 对不起,代码墙。。。我已经尝试了很多方法,但没有一种有效 还有谁能告诉我为什么每次不运行时都会发出第一个select?!这应该是难以置信的简单,但我已经花了几个小时在它现在,我只是准备放弃流利的NHibernate。。。写一些SQL可能会更容易 public class Order { public virtual int OrderId { get; set; } private IList&

我正试图找出fluent nhibernate中以下一对多关系的持久性规范应该是什么

对不起,代码墙。。。我已经尝试了很多方法,但没有一种有效

还有谁能告诉我为什么每次不运行时都会发出第一个select?!这应该是难以置信的简单,但我已经花了几个小时在它现在,我只是准备放弃流利的NHibernate。。。写一些SQL可能会更容易

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(); }
}
这部分是基于对问题的回答

它正在进行选择以查看订单是否已经存在。会话中没有足够的上下文来决定是执行插入还是执行更新