NHibernate 一对一关系,谁能帮我一下

net_member 2010-10-28 04:25:14

1)实体:


1个账号只能关联0-1个详细信息实体对象
// 账号


public class Account
{
// Id
public virtual string UserId { get; set; }

// 密码
public virtual string Password { get; set; }

// 状态
public virtual int State { get; set; }

// 关联基本信息
public virtual DetailInfo Detail { get; set; }

}


//详细信息

public class DetailInfo 
{
public virtual Guid Id { get; set; }
// 地址
public virtual string ShopAddress { get; set; }

// Email
public virtual string Email { get; set; }

// QQ号
public virtual string QQ { get; set; }

// 关联的登录账号
public virtual Account RelAccount { get; set; }
}



2)映射
Account.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="WebTest"
namespace="WebTest">

<class name="Account" table="Account">
<id name="UserId" column="UserId" type="String">
<generator class="assigned" />
</id>
<property name="Password" type="String"/>
<property name="State" type="Int32" />

<!--关联基本信息-->
<one-to-one name="Detail" class="DetailInfo" cascade="all-delete-orphan" lazy="proxy"
property-ref="RelAccount" />
</class>
</hibernate-mapping>


DetailInfo.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="WebTest"
namespace="WebTest">

<class name="DetailInfo" table="DetailInfo">
<id name="Id" column="Id" type="Guid" >
<generator class="assigned" />
</id>
<property name="ShopAddress" type="String" />
<property name="QQ" type="String" />
<property name="Email" type="String" />

<many-to-one name="RelAccount" class="Account" column="UserId" unique="true" />
</class>
</hibernate-mapping>


3)测试

 string id = "dd";
string pwd = "BB";

string email = "ee";
string qq = "CCC";
string shopAddress = "DE";



DetailInfo detail = new DetailInfo
{
Email = email,
QQ = qq,
ShopAddress = shopAddress,
Id = Guid.NewGuid()
};

Account account = new Account
{
UserId = id,
Password = pwd,
State = 1,
};

account.Detail = detail;
detail.RelAccount = account;




ISession s = SessionProvider.GetSession();
using (ITransaction tr = s.BeginTransaction())
{
s.SaveOrUpdate(account);
s.Flush();
tr.Commit();
}

4)测试结果
当执行一次,数据库的Account表和DetailInfo表都能如愿的保存了“一对一”的记录,
但是,但我马上在执行一次,则Account表没有变化,而DetailInfo表多了一条新的记录,
理想中,再第一次执行同样的测试代码应该在两个表中都没有新的记录产生,

这就是问题,我不知道到底错在什么地方??请高手帮我看看。万分感谢
...全文
423 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuan.ye 2010-12-23
  • 打赏
  • 举报
回复
最简单的就是别建立nhibernate的关系。
建立数据库的关系+事物处理+异常处理
kikop_freedom 2010-12-23
  • 打赏
  • 举报
回复
<many-to-one name="RelAccount" class="Account" column="UserId" unique="true" />

这里已声明为 unique="true",程序运行应该如lz让所愿.
如果不对,就是楼主的数据库表恐怕没有为这个列添加唯一键约束
net_member 2010-10-29
  • 打赏
  • 举报
回复
别沉下去啊???
net_member 2010-10-29
  • 打赏
  • 举报
回复
难道就没有解决的办法了吗/
kokorenfeng 2010-10-29
  • 打赏
  • 举报
回复
这两张表都有一个字段是另一个类的外键类
save()到没问题,
但又要update()
如果要修改与外键类相关联的字段,这问题不能解决
就成了一个循环问题了
phil999 2010-10-29
  • 打赏
  • 举报
回复
我觉得这是使用方式的问题。楼主已将主键生成策略设为 assigned,实际上是你在声明,你的C#代码保证唯一性。在第二次调用的时候,account 的主键是重复的。下面的文字出自 nh 的文档:

5.1.4.7. 程序分配的标识符(Assigned Identifiers)
如果你需要应用程序分配一个标示符(而非NHibernate来生成它们),你可以使用assigned生成器。 这种特殊的生成器会使用已经分配给对象的标识符属性的标识符值。用这种特性来分配商业行为的关键字要特别小心(基本上总是一种可怕的设计决定)。

因为其继承天性,使用这种生成器策略的实体不能通过ISession的SaveOrUpdate()方法保存。作为替代, 你应该明确告知NHibernate是应该被save还是update,分别调用ISession的Save()或Update()方法。
dafen496050286 2010-10-29
  • 打赏
  • 举报
回复
cascade="all"
net_member 2010-10-28
  • 打赏
  • 举报
回复
????期待中啊。。。
net_member 2010-10-28
  • 打赏
  • 举报
回复
phil999 分析得非常对,我也发现了这个问题,如果我改成Save()方法,就没有问题。。

但是我这里如果非要用SaveOrUpdate()方法,哪应该怎么来解决这个问题?
phil999 2010-10-28
  • 打赏
  • 举报
回复
两次执行这段代码,account.userId 是相同的,由于是 saveorupdate,因此,第一次是 save,第二次是update,所以看起来数据是没变

在saveorupdate调用之前,account 是一个 transient 对象,访问它的 Detail 不会导致数据库访问,当然不会加载其对应的 DetailInfo。所以,在C#代码里,楼主的期望落空了

<many-to-one name="RelAccount" class="Account" column="UserId" unique="true" />

这里已声明为 unique="true",但是,楼主的数据库表恐怕没有为这个列添加唯一键约束。saveorupdate 时,nh 不会验证是否只有一条 DetailInfo 记录与此 account 关联,它仅仅是为第二个 DetailInfo 创建记录。由于没有唯一键约束,此操作成功。在数据库里,楼主的期望再次落空

wuyq11 2010-10-28
  • 打赏
  • 举报
回复
net_member 2010-10-28
  • 打赏
  • 举报
回复
难道没人吗????
net_member 2010-10-28
  • 打赏
  • 举报
回复
焦急等待啊。。。。

62,271

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧