1

我有 Person 和 LoginAccount 类,我想在其中进行一对零或一对一的映射。即一个人可以有零个或只有一个登录帐户。

我试过这个.. Person.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>

<id name="PersonID">
  <generator class="native" />
</id>


<property name="Title" />
<property name="FirstName"  />
<property name="SecondName"  />
<property name="ThirdName"  />
<property name="LegalFullName"  />
<property name="LegalFullNameLocal"  />
<property name="AliasFullName"  />
<property name="Suffix"  />
<property name="PreviousLegalName"  />
<property name="ReasonForNameChange"  />
<many-to-one class="OESPCS.Model.LoginAccount" column="LoginAccountID" name="LoginAccount"  foreign-key="fk_LoginAccountID_Person"  unique="true">

</many-to-one>

登录帐户.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>

<class name ="LoginAccount">

  <id name="LoginAccountID">
    <generator class="native" />
  </id>

  <property name="LoginId" unique="true" />
  <property name="Password" />
  <property name="SaltKey" />
  <property name="PasswordChangedOnDate"/>
  <property name="IsPasswordChangeRequired" />
  <property name="IsKeepSignedIn" />
  <property name="IsMultiSessionAllowed" />


  <property name="PrivacyPolicyVersion" />
  <property name="IsLocked"  />
  <property name="LockedOnDate" />
  <property name="LockedTillDate" />
  <property name="IsDisabled" />
  <property name="DisabledOnDate"  />
  <property name="DisabledTillDate" />


  <property name="LoginFailAttempts" />

  <one-to-one class="OESPCS.Model.Person" name="person"  foreign-key="fk_LoginAccount_PersonID"/>


</class>

在 DB 中,此映射为我提供了一对一的映射,但在我的项目中,人可能没有 LoninAccount,因此在个人表中 LoginAccountId 可以为空,但正如我们所说的 unique=true 个人 hbm 所以它不允许多次。

所以我需要做一对零或一个映射这可能吗?

如何解决这个问题呢?

4

1 回答 1

0

当您不熟悉 NHibernate 时,您应该考虑使用按代码映射的技术,例如 Fluent NHibernate 或 NH 集成的自动映射(在 3.2 中引入)。

以下示例代码 (Fluent NHibernate) 应该可以帮助您入门:

public class LoginAccount 
{
public virtual Int Id  { get; set; };
public virtual string Password { get; set; };
public virtual string Saltkey { get; set; };

public virtual Person BelongsTo{ get; set; }

  public LoginAccount()
  {
  }
}

public class LoginAccountMap: ClassMap<LoginAccount>
{
  public LoginAccountMap()
  {
    Id(x => x.Id);
    Map(x => x.Password);
    Map(x => x.Saltkey);

    References(c => c.BelongsTo).Cascade.None().Fetch.Join().NotFound.Ignore();
  }
}

public class Person
{
public virtual Int Id  { get; set; };
public virtual string FirstName  { get; set; };
public virtual string SureName  { get; set; };

public virtual LoginAccount UserAcc{ get; set; }

  public Person()
  {
  }
}

public class PersonMap: ClassMap<Person>
{
  public PersonMap()
  {
    Id(x => x.Id);
    Map(x => x.FirstName);
    Map(x => x.SureName);

    References(c => c.UserAcc).Cascade.SaveUpdate().Fetch.Join().NotFound.Ignore();
  }
}
于 2012-08-29T11:29:31.380 回答