Nhibernate中的一对零或一映射

Nhibernate中的一对零或一映射,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我有一个Person adn LoginAccount类,我想在其中进行一到零或一个映射。i、 e一个人可以有零个或只有一个loginaccount 我试过了。。 Person.hbm.xml <?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?> LoginAccount.hbm.xml 在DB,此映射为我提供了一对一映射,但在我的项目中

我有一个Person adn LoginAccount类,我想在其中进行一到零或一个映射。i、 e一个人可以有零个或只有一个loginaccount

我试过了。。 Person.hbm.xml

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


LoginAccount.hbm.xml



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

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


<如何解决这个问题?

< P>当你是NHEnLeNT的新手时,你应该考虑使用代码技术的映射,比如FLUENT NHiBiNATE或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();
  }
}
公共类登录帐户
{
公共虚拟Int Id{get;set;};
公共虚拟字符串密码{get;set;};
公共虚拟字符串Saltkey{get;set;};
公共虚拟人BelongsTo{get;set;}
公共登录帐户()
{
}
}
公共类LoginAccountMap:ClassMap
{
公共LoginAccountMap()
{
Id(x=>x.Id);
映射(x=>x.Password);
Map(x=>x.Saltkey);
引用(c=>c.BelongsTo).Cascade.None().Fetch.Join().NotFound.Ignore();
}
}
公共阶层人士
{
公共虚拟Int Id{get;set;};
公共虚拟字符串FirstName{get;set;};
公共虚拟字符串SureName{get;set;};
公共虚拟登录帐户UserAcc{get;set;}
公众人士()
{
}
}
公共类PersonMap:ClassMap
{
公众人物地图()
{
Id(x=>x.Id);
Map(x=>x.FirstName);
Map(x=>x.SureName);
引用(c=>c.UserAcc.Cascade.SaveUpdate().Fetch.Join().NotFound.Ignore();
}
}

unique=“false”
有什么问题?它毕竟不是唯一的,不是吗?谢谢Alex,但是我们可以通过用XML编写的mappin文件来实现吗。我不能使用fluent NH,我会留意NH 3.2。通过使用最新的NH版本,您应该能够同时使用XML和代码映射。请记住,通过使用xml映射,您的程序将变得非常静态:NH不会反映或自动注意对buissnes对象(您的模型)的更改。因此,改变特性f.e.变得非常危险。这就是我不建议使用xml-mapping的原因。如果您没有选择,请在您的“-标记中尝试“not found='ignore'”。
<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>
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();
  }
}