【问题标题】:Fluent NHibernate HasMany not inserting parent idFluent NHibernate HasMany 没有插入父 ID
【发布时间】:2011-06-14 21:15:38
【问题描述】:

我不明白为什么 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 INTO OrderNotes(OrderNoteId, NoteBy, Note)

应该是:

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

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

【问题讨论】:

  • 当订单有一个 Guid 作为它的主键的 RowId 时,我有这个工作。它仍然有一个 OrderId 属性,并且在 HasMany 关系中指定为 PropertyRef。

标签: nhibernate fluent-nhibernate


【解决方案1】:

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

另外添加一个References(x =&gt; x.Order); 到您的OrderNoteClassMap

您也可以尝试删除 HasMany 映射上的 Inverse,但我认为这不会成功。

【讨论】:

  • 您不必将 OrderNote 上的属性添加回父级,因为它是反向关系。这将建立一个双向关系。
  • RexM 是对的。对于逆映射,您需要双向关系。 OrderNote 需要驱动它属于哪个订单。
  • 那么,如果我使用 PropertyRef 而不是 ID 作为外键,为什么它会起作用?
  • 老兄,逻辑思考。如果子需要驱动关系,如 Inverse() 关键字所指定,则子需要知道其父。您显然不想要逆映射。把它拿出来,让家长开车。
  • 我猜这只是那些日子之一。我也知道这一点,但我的大脑全都扭曲了。把 Inverse() 拿走就解决了这一切。
【解决方案2】:

尝试创建一个从 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2013-04-24
    • 2012-04-03
    • 2012-10-19
    • 2011-12-20
    • 2011-04-15
    • 1970-01-01
    相关资源
    最近更新 更多