流畅的NHibernate HasMany不插入父ID

时间:2011-06-14 13:05:59

标签: nhibernate fluent-nhibernate

我无法弄清楚为什么NHibernate在没有外键的情况下插入子实体。这是我的课程

public class Order {
    public Order() {
        this.Notes = new List<OrderNote>();
    }

    public virtual int OrderId {get; private set;}
    public virtual IList<OrderNote> Notes {get; private set;}
}

public class OrderNote {
    public OrderNote(string noteBy, string note) {
        this.OrderNoteId = Guid.NewGuid();
        this.NoteBy = noteBy;
        this.Note = note;
    }

    public virtual Guid OrderNoteId {get; private set;}
    public virtual string NoteBy {get; private set;}
    public virtual string Note {get; private set;
}

以下是我的Fluent NHibernate映射文件

public class OrderClassMap : ClassMap<Order> {
    public OrderClassMap() {
        Id(x => x.OrderId).GeneratedBy.Native();
        HasMany(x => x.Notes).Inverse.KeyColumn("OrderId").Cascase.AllDeleteOrphan();
    }
}

public class OrderNoteClassMap : ClassMap<OrderNote> {
    public OrderNoteClassMap() {
        Id(x => x.OrderNoteId).GeneratedBy.Assigned();
        Map(x => x.NoteBy);
        Map(x => x.Note);
    }
}

当我在订单的注释集合中添加注释并保存订单时,订单注释将被插入到数据库中,而不包含外键。

Order order = session.Query<Order>().Where(o => (o.OrderId == orderId)).Single();
order.Notes.Add(new OrderNote("Name", "This is a note"));
session.SaveOrUpdate(order);

生成的insert语句是:

INSERT INTO OrderNotes(OrderNoteId, NoteBy, Note)

应该是:

INSERT INTO OrderNotes(OrderNoteId, NoteBy, Note, OrderId)

为什么会这样?我做错了什么?

2 个答案:

答案 0 :(得分:3)

Order属性添加到OrderNote类,并将其设置为您要添加备注的订单对象。

同时为References(x => x.Order);

添加OrderNoteClassMap

您也可以尝试删除Inverse映射中的HasMany,但我认为不会这样做。

答案 1 :(得分:0)

尝试创建从OrderNote到Order的反向关系映射,并在OrderNote类中添加Order属性。

我用来创建像“addNote”

这样的方法
Order order = session.Query<Order>().Where(o => (o.OrderId == orderId)).Single();
order.AddNote(new OrderNote("Name", "This is a note"));
session.SaveOrUpdate(order);

public virtual AddNote(OrderNote note)
{
note.Order=this;
order.Notes.Add(note);
}