考虑我有父,子关系类和映射.我正在使用NHibernate从数据库中读取对象,并打算使用WCF通过线路发送对象.
[DataContract],它不能被序列化,因为属性是延迟加载代理而不是真正的已知类型.lazy=false或lazy=true不起作用.前者将急切地获取所有关系,后者将创建一个代理.但我不想要任何东西 - 一个null是最好的.null我不想获取的引用.null,但不仅仅是代理.这将使WCF满意,并浪费更少的时间来构建延迟加载代理.GetObjectToSerialize,我从未观察到代理被传递GetObjectToSerialize,没有机会取消代理它.阅读评论后,更多在网上冲浪......
在我看来,DTO会将计算的主要部分转移到服务器端.但对于我正在开发的项目,50%的时间客户端比服务器"更智能",服务器更像是一个带有验证和验证的数据存储.虽然我同意服务器不是很愚蠢 - 我必须决定何时获取额外的引用,而DTO将使这一点非常明确.
也许我应该忍受痛苦.之前我不知道http://automapper.codeplex.com/,这激励我多一点痛苦.
另一方面,我发现http://trentacular.com/2009/08/how-to-use-nhibernate-lazy-initializing-proxies-with-web-services-or-wcf/,这似乎与IDataContractSurrogate.GetObjectToSerialize.
我正在使用NHibernate与PostgreSQL数据库连接.
背景
我做了一些简单的测试......似乎需要2秒才能坚持300条记录.我有一个具有相同功能的Perl程序,但是发出直接SQL,只占70%的时间.我不确定这是否是预期的.我认为C#/ NHibernate会更快或至少相提并论.
问题
我的一个观察是(show_sql打开),NHibernate发出INSERT几百次,而不是进行处理多行的批量INSERT.请注意我自己分配主键,而不是使用"本机"生成器.
这是预期的吗?反正我是否可以让它发出批量INSERT语句?在我看来,这可能是我可以加速表现的领域之一.
让我用一个 SQL 示例来开始我的问题。
这是表设置:
x和y. 与y.x指x.id。x(id=1)。START TRANSACTION;
CREATE TABLE `x` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`value` INT(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB;
CREATE TABLE `y` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`x_id` INT(11) NOT NULL,
`value` INT(11) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_x` FOREIGN KEY (`x_id`)
REFERENCES `x` (`id`)
) ENGINE=INNODB;
INSERT INTO x values (1,123456);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
现在启动一个事务 (Trx A) 来更新 中的行x。 …
nhibernate ×2
bulk ×1
c# ×1
foreign-keys ×1
innodb ×1
insert ×1
lazy-loading ×1
mysql ×1
postgresql ×1
rowlocking ×1
wcf ×1