映射

2015-04-23 42 views
4

我已经通过FluentMapping映射

public class RuleMap : ClassMap<Rule> 
{ 
    public RuleMap() 
    { 
     Table("NEW"); 

     Id(x => x.Id, "Id").Not.Nullable(); 
     Map(x => x.SenderId, "SenderId").Nullable(); 
    } 
} 

定义的以下映射为下面的类

public class Rule 
{ 
    public virtual int Id { get; set; } 

    public virtual int? SenderId { get; set; } 
} 

我在数据库表被定义为

USE [Test] 
GO 

/****** Object: Table [dbo].[NEW] Script Date: 23.04.2015 22:14:53 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[NEW](
    [Id] [int] NOT NULL, 
    [SenderId] [int] NULL, 
CONSTRAINT [PK_NEW] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 
在0可为空的属性的结果,但不为空

并且有一个单一的条目

Id | SenderId 
1 | `NULL` 

现在,当我通过我的SessionFactory

var rules = sessionFactory.QueryOvery<Rule>.List(); 

列表中包含1项(到目前为止好)加载所有的规则,但该属性SenderId的值为和不是NULL我有预料。

那么我在这里做错了什么?

使用NHibernate 3.1和FluentNHibernate 1.2。

回答

2

更改您的映射,

public class NullableMap : ClassMap<Nullable> 
{ 
    public NullableMap() 
    { 
     Table("nullable"); 
     LazyLoad(); 
     Id(x => x.Id).GeneratedBy.Identity().Column("id"); 
     Map(x => x.SenderId, "SenderId").Nullable().Default(null); 
    } 
} 

,其中默认值设置为空(.Default(null);

+0

谢谢您的回答。我的问题现在解决了。代码和设置都是正确的,但数据库中的值不是。昨天有点晚了。 – Jehof

+0

对不起,但不是,您不需要声明默认值null以在可为空的列中获得NULL。一个可能的例外可能是如果有一些映射约定设置了默认值 - 但我不确定这样的事情能否被这种方式覆盖,并且有人可能会认为这是有缺陷的约定,应该修正。 –