2013-04-10 57 views
1

鉴于以下模型,我希望能够输入新的WriteOffApprovalUser并使Employee字段为空。这是1:1或null关系。流利的NHibernate - 1:1与可空字段的关系

public class WriteOffApprovalUser 
{ 
    public virtual string UserName { get; set; } 
    public virtual Employee Employee { get; set; } 
} 

public class Employee 
{ 
    public virtual string EmployeeID { get; set; } 
    public virtual string EmployeeStatusCode { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual string JobTitle { get; set; } 
    public virtual string Division { get; set; } 
    public virtual string Department { get; set; } 
    public virtual string Location { get; set; } 
    public virtual string City { get; set; } 
    public virtual string DeskLocation { get; set; } 
    public virtual string MailID { get; set; } 
    public virtual string Phone { get; set; } 
    public virtual string PreferredName { get; set; } 
    public virtual string Fax { get; set; } 
    public virtual string SecCode { get; set; } 
    public virtual string SupervisorID { get; set; } 
    public virtual string UserId { get; set; } 
} 

类映射

public class WriteOffApprovalUserMap : ClassMap<WriteOffApprovalUser> 
{ 
    public WriteOffApprovalUserMap() 
    { 
     Table("WRITEOFF_APPROVAL_USER"); 

     Id(x => x.UserName).Column("USER_NAME"); 

     //Map(x => x.Employee).Nullable(); 

     HasOne(x => x.Employee) 
      .Class<Employee>() 
      .Constrained() 
      .Cascade.SaveUpdate() 
      .PropertyRef("UserId"); 
    } 
} 

public class EmployeeMap : ClassMap<Employee> 
{ 
    public EmployeeMap() 
    { 
     Table("ADP_EMPLOYEE"); 

     Id(x => x.EmployeeID).Column("EMPLID").GeneratedBy.Native(""); 

     Map(x => x.FirstName).Column("FIRST_NAME"); 
     Map(x => x.LastName).Column("LAST_NAME"); 
     Map(x => x.PreferredName).Column("PREFERRED_NAME"); 
     Map(x => x.UserId).Column("USER_ID"); 
    } 
} 

查询/保存

using (var session = SessionProvider.GetSession()) 
     { 
      using (var tx = session.BeginTransaction()) 
      { 
       var user = new WriteOffApprovalUser() { UserName = "SAMSTR" }; 

       session.Save(user); 

       tx.Commit(); 
      } 
     } 

这抱怨Employee为空。我如何指定该员工可以为空?

此外,所有Id字段必须是整数?我们桌子上的很多按键都是字符串。

回答

-1

首先,如果你把它作为1:1,它不应该是NULL,因为它不是正确的设计。

但在这里是如何做到这一点的例子:

1)的一种方法

HasOne(x => x.Employee) 
      .Class<Employee>().Nullable().NotFound.Ignore().PropertyRef("UserId"); 

2)方式二

References(x => x.Category).Column("UserId").Nullable().NotFound.Ignore(); 
+0

OK,但真正发生的是有一个'雇主'已经和我只想进入'WriteOffApprovalUser',然后当我查询关系的时候。我不想添加“员工”一侧,但总是只有一个“员工”到一个“WriteOffApprovalUser”,反之亦然。合理? – Sam 2013-04-10 15:34:54

+0

我得到这个错误:''FluentNHibernate.Mapping.OneToOnePart '不包含'Nullable'的定义,也没有接受'FluentNHibernate'类型的第一个参数的扩展方法'Nullable'。可以找到Mapping.OneToOnePart (您是否缺少使用指令或程序集引用?)' – Sam 2013-04-10 15:37:08

+0

您的意思是延迟加载?对于性能问题或设计你不需要这个'实体' – IamStalker 2013-04-10 15:37:10