jck*_*yes 9 nhibernate fluent-nhibernate
首先,我有下表:
CREATE TABLE CustomerHub (
CustomerId INT NOT NULL,
HubId INT NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
我已映射到此实体:
public class CustomerHub
{
public int CustomerId {get;set;}
public int HubId {get;set}
//GetHashCode, Equals, Etc...
}
Run Code Online (Sandbox Code Playgroud)
使用此映射:
public class CustomerHubMap : ClassMap<CustomerHub>
{
UseCompositeId()
.WithKeyProperty(x => x.CustomerId)
.WithKeyProperty(x => x.HubId);
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当我创建一个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();
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,没有抛出任何异常,它只是没有做任何事情.我启动了NH Profiler(优秀工具!),看起来它没有向数据库发出任何类型的insert命令.
思考?
注意:我意识到这个表看起来很像一个连接表(因为它在技术上是)并且最好在另一个实体(如Customer)上作为ManyToMany关系服务...但是由于一些非常棘手的数据设计(即没有Hub表) )将连接表映射到实体并以这种方式使用它更简单.
编辑(放在顶部)
来自NHibernate docs的引用:
由于其固有特性,使用此生成器的实体无法通过ISession的SaveOrUpdate()方法保存.相反,如果要通过调用ISession的Save()或Update()方法来保存或更新对象,则必须明确指定NHibernate.
http://www.nhforge.org/doc/nh/en/index.html#mapping-declaration-id-assigned(5.1.4.7)
复合ID具有generator = assigned.
这可以追溯到复合id = sucking :)
您没有发出刷新或提交.您可能习惯使用类似于在保存时发出INSERT的标识,但复合由您的代码而不是数据库分配,因此您需要刷新/提交以进行插入.
var custHub = new CustomerHub {CustomerId = 293, HubId = 1193};
var y = session.SaveOrUpdate(custHub);
session.Flush();
Run Code Online (Sandbox Code Playgroud)
要么
using(var tx = session.BeginTransaction())
{
var custHub = new CustomerHub {CustomerId = 293, HubId = 1193};
var y = session.SaveOrUpdate(custHub);
tx.Commit();
}
Run Code Online (Sandbox Code Playgroud)
另外,一个注意事项:使用复合键会让你讨厌你的生活.复合键很多东西都不起作用,并不是很明显.基本上NHibernate可以做更少的工作,所以你必须收拾松懈.
| 归档时间: |
|
| 查看次数: |
5659 次 |
| 最近记录: |