NHibernate 3.3:在Id中将类型设置为Ansistring,以便按代码进行映射

时间:2012-10-29 05:47:07

标签: c# nhibernate orm mapping-by-code

我正在映射以下实体:

public class PersonEntity
{
    public virtual string PersonId { get; set; }

    public virtual String Salutation { get; set; }
    public virtual String FirstName { get; set; }
    public virtual String LastName { get; set; }
    public virtual DateTime Birthdate { get; set; }
}

public class PersonMap : ClassMapping<PersonEntity>
{
    public PersonMap()
    {
        //ComponentAsId(i => i.Key, map => map.Property(p => p.PersonId, m => m.Type(NHibernateUtil.AnsiString)));

        Id(i => i.PersonId, map => map.Type(???)));
        Property(i => i.Salutation);
        Property(i => i.FirstName);
        Property(i => i.LastName);
        Property(i => i.Birthdate);
    }
}

正如您在注释掉的代码中所看到的,当使用组件作为Id时,我可以使用NHibernateUtil将类型设置为AnsiString。但是我无法弄清楚在普通Id映射中要做什么。

我尝试过使用new NHibernate.Type.AnsiStringType(),但是抱怨没有为它定义构造函数。

任何想法的家伙?

3 个答案:

答案 0 :(得分:4)

我必须显式地将AnsiStringType转换为IIdentifierType并设置length属性。

       Id(x => x.Id,
       m =>
       {
           m.Generator(Generators.Assigned);
           m.Type((IIdentifierType)TypeFactory.GetAnsiStringType(16));
           m.Length(16);
       });

答案 1 :(得分:1)

使用NHibernate.Type.TypeFactory.GetAnsiStringType(someLength)

答案 2 :(得分:0)

在SetParameterList()的情况下,NHibernate.Type.TypeFactory.GetAnsiStringType(someLength)不起作用,因此我将其更改为NHibernateUtil.AnsiString。这将参数更改为varchar(8000)仍然可用,而不是nvarchar(4000),nvarchar(4000)导致执行计划选择的更改出现问题。