继续我在我的播客应用程序中对NHibernate的探索,我遇到了一些奇怪的事情:当我期望INSERT时,NHibernate正在更新.情况是播客与其项目之间的简单的一对多关系.这是我的NHibernate映射:
<hibernate-mapping assembly="App.DataModel">
<class name="Feed" table="Feeds">
<!-- snip -->
<bag name="FeedItems" table="FeedItems" cascade="all">
<key column="FeedId" />
<one-to-many class="FeedItem" />
</bag>
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
情况是:我创建了一个新Podcast对象,从feed更新它(所以Podcast.FeedItems集合属性包含许多FeedItems),现在我将它保存到数据库中ISession.Save().根据NHibernate日志文件判断,该Podcast对象已正确插入数据库,但该FeedItems集合正在UPDATEd中.这是为以下内容生成的SQL Podcast:
INSERT INTO Feeds (
Uri, IsPublic, Title, Description, Link, Language, Copyright,
LastBuildDate, PublishDate, Docs, Webmaster, Author, Subtitle,
Summary, OwnerName, OwnerEmail, IsExplicit, ImageUri, Id
) VALUES (
@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11,
@p12, @p13, @p14, @p15, @p16, …Run Code Online (Sandbox Code Playgroud) 我一直在使用NHibernate一段时间,但主要是使用基于约定的自动持久性模型生成,然后对对象执行基本的CRUD操作.
我现在需要对遗留系统执行相当讨厌的查询以及一整套参数(大多数where子句需要参数化).我不清楚我是应该定义单个对象然后尝试实现复杂查询还是仅使用本机SQL来定义查询.我也不清楚在hbm.xml文件中定义查询的正确语法.本机SQL查询如下.感谢任何能帮助我解决这个问题的人.
WITH CTE AS ( SELECT
substr(KEY1||KEY2||KEY3||'-'||digits(KEY4)||'-'||digits(KEY5),1,17) KEY_ID,
SUM(CASE WHEN BATCH between 200801001 and 200812999 THEN TRANSACTION_AMOUNT ELSE 0 END) AS _2008AMOUNT,
SUM(CASE WHEN BATCH between 200901001 and 200912999 THEN TRANSACTION_AMOUNT ELSE 0 END) AS _2009AMOUNT,
SUM(CASE WHEN BATCH between 201001001 and 201012999 THEN TRANSACTION_AMOUNT ELSE 0 END) AS _2010AMOUNT
FROM _SCHEMA.TRANSACTIONS
WHERE OWNER='02'
AND TRANSACTION_TYPE in ('A','B')
AND BATCH between 200801000 AND 201012999
GROUP BY KEY1, KEY2, KEY3, KEY4, KEY5
HAVING SUM(CASE WHEN BATCH between 200801001 and 200812999 …Run Code Online (Sandbox Code Playgroud) 我正在尝试以这样的方式映射实体属性:它将其值写入数据库列,但使用公式检索其值.
为了关注实际问题,我简化了示例.实际上,公式有点复杂,并且正在使用NHibernate过滤器.
<many-to-one cascade="all" class="Thing" lazy="false" name="MyThing"
formula="(SELECT Things.Value FROM Things WHERE Things.Id = MyThingId)">
<column name="MyThingId" />
</many-to-one>
Run Code Online (Sandbox Code Playgroud)
但是,除非我删除该<column name="MyThingId" />行,否则将忽略该公式.
为了让NHibernate使用公式,我将如何修复此映射?
最近我发现了一个关于NHibernate的一对多关系的例子.映射如下:
<class name="Company" table="Company">
<id name="Id" type="Int32" unsaved-value="0">
<generator class="identity"/>
</id>
<version name="Version"/>
<property name="Name"/>
<set name="Customers" inverse="true" lazy="true" >
<key column="Id"/>
<one-to-many class="Customer"/>
</set>
</class>
<class name="Customer" table="Customer">
<id name="Id" type="Int32" unsaved-value="0">
<generator class="identity"/>
</id>
<version name="Version"/>
<property name="DateOfBirth"/>
<property name="FirstName"/>
<property name="Surname"/>
<many-to-one name="Company" column="CompanyId" cascade="all-delete-orphan"/>
</class>
Run Code Online (Sandbox Code Playgroud)
这是课程:
public class Company
{
private ISet<Customer> customers = new HashedSet<Customer>();
public int Id { get; set; }
public string Name { get; set; }
public int …Run Code Online (Sandbox Code Playgroud)