【问题标题】:Fluent NHibernate -- Saving Entity with Composite KeyFluent NHibernate -- 使用复合键保存实体
【发布时间】:2009-07-27 18:31:28
【问题描述】:

首先,我有下表:

CREATE TABLE CustomerHub (
   CustomerId INT NOT NULL,
   HubId INT NOT NULL
)

我已经映射到这个实体:

public class CustomerHub
{
   public int CustomerId {get;set;}
   public int HubId {get;set}

   //GetHashCode, Equals, Etc...
}

使用此映射:

public class CustomerHubMap : ClassMap<CustomerHub>
{
   UseCompositeId()
      .WithKeyProperty(x => x.CustomerId)
      .WithKeyProperty(x => x.HubId);
}

我遇到的问题是,当我创建一个 CustomerHub 类型的新实体并尝试保存它时,数据库中没有任何内容。我能够很好地检索所有内容,只是不保存它们。例如:

//this will work
var x = session.CreateCriteria(typeof(CustomerHub)); 

//this will not
using (var trans = session.BeginTransaction()) 
{
   var custHub = new CustomerHub {CustomerId = 293, HubId = 1193};
   var y = session.SaveOrUpdate(custHub); 
   trans.Commit();
}

奇怪的是没有抛出异常,它只是什么都不做。我启动了 NH Profiler(出色的工具!),看起来它没有向数据库发出任何类型的插入命令。

想法?

注意:我意识到这个表看起来很像一个连接表(因为它在技术上是)并且最好用作另一个实体(如客户)上的多对多关系......但由于一些非常混乱的数据设计(即没有 Hub 表)将连接表映射到实体并以这种方式使用它要简单得多。

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

    编辑(放在顶部)

    来自 NHibernate 文档的引用:

    由于其固有性质,使用此生成器的实体无法通过 ISession 的 SaveOrUpdate() 方法保存。相反,您必须通过调用 ISession 的 Save() 或 Update() 方法来显式指定 NHibernate 是否应该保存或更新对象。

    http://www.nhforge.org/doc/nh/en/index.html#mapping-declaration-id-assigned (5.1.4.7)

    复合 ID 已分配生成器 =。

    这又回到复合 id = 吮吸 :)


    您没有发出刷新或提交。您可能习惯于使用诸如在保存时发出 INSERT 的标识之类的东西,但复合是由您的代码而不是数据库分配的,因此您需要刷新/提交才能进行插入。


    var custHub = new CustomerHub {CustomerId = 293, HubId = 1193};
    var y = session.SaveOrUpdate(custHub);
    session.Flush();
    

    using(var tx = session.BeginTransaction())
    {
        var custHub = new CustomerHub {CustomerId = 293, HubId = 1193};
        var y = session.SaveOrUpdate(custHub);
        tx.Commit();
    }
    

    另外,请注意:使用复合键会让您讨厌自己的生活。复合键的很多事情都不是一样的,而且不是很明显。基本上 NHibernate 可以做的工作更少,所以你必须收拾残局。

    【讨论】:

    • 感谢您的快速回答。为简洁起见,我将其省略了,但我将所有调用都包含在与您的第二个示例非常相似的代码中。我也尝试了同花但没有运气。
    • 添加了更新。我不确定 SaveOrUpdate 的事情,所以等着看这是否有效:p
    • 我最近正在阅读有关 SaveOrUpdate 如何工作的部分,但不清楚它将如何处理复合 ID...这可能是他们甚至不尝试的原因。
    • 虽然我发誓我以前用过...但我认为它已经处于会话状态...我讨厌复合ID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    相关资源
    最近更新 更多