Fluent nHibernate automapping property as nvarchar(max)
Asked Answered
I

3

12

using fluent nhibernate, and automappings (nhibernate creates my db schema), how can i get nhibernate to create a nvarchar(max) column in the database based on the following class

public class VirtualPage : BaseEntity
{
    public virtual int ParentId { get; set; }
    public virtual string PageName { get; set; }
    public virtual string Title { get; set; }
    public virtual string Body { get; set; }
    public virtual string ViewName { get; set; }
    public virtual string ViewData { get; set; } // this must be nvarchar(max)
}
Impartible answered 20/8, 2010 at 15:19 Comment(0)
C
32

With automapping you can override the default length for text fields, but it will be applied to all text fields.

You should be able to combine automapping with explicit mappings created with the fluent API.

Fortunately, this is a pretty simple class to map (I'm assuming that this is part of a table-per-subclass hierarchy, which is why I use SubClassMap<> instead of ClassMap<> and do not map an identifier):

public class VirtualPageMap : SubClassMap<VirtualPage>
{
    public VirtualPageMap()
    {
        Map(x => x.ParentId);
        Map(x => x.PageName);
        Map(x => x.Title);
        Map(x => x.Body);
        Map(x => x.ViewName);
        Map(x => x.ViewData).Length(4001); // anything over 4000 is nvarchar(max)
    }
}

I've actually never used automappings, so I'm assuming that this will be picked up properly, but do not know for sure.

Don't forget to add the mapping in your configuration.

Fluently.configure(
    // blah blah blah
    .Mappings(m => 
    {
        m.FluentMappings.AddFromAssemblyOf<VirtualPage>();
        m.AutoMappings.Add( // blah blah blah
    }
Chondrule answered 27/8, 2010 at 19:49 Comment(2)
thanx m8, after little configuration and using your example it worked like a charm..Impartible
Please keep in mind that using .Length(int.MaxValue) maps to nvarchar (255). Also, not using .Length at all, maps to nvarchar (255)Telemetry
R
2

Set the Length property to a high number (I use 10000) - this will cause NHibernate to make a nvarchar(max)

Reservist answered 20/8, 2010 at 15:27 Comment(4)
how does one set the length of a property?Impartible
Map(x => x.<property>).Length(10000) :-)Reservist
hmmmm sorry... maybe i should have told you that i started using nhibernate 2 days ago :), this means i have absolutely NO idea where that must go. thanx for helping thoughImpartible
Ahh - I missed the AutoMapping part, sorry about that. See this blogpost for how to achieve it for a single property: serialseb.blogspot.com/2009/01/…Reservist
C
0

As an alternative if you prefer to work with attributes directly on your domain rather than having all the lengths within the mappings you can do as follows

In your domain use the built in StringLength attribute, for nvarchar(max) set it to 4001 or higher

[StringLength(4001)]
public virtual string? Description { get; set; }

Then you can create a property convention to map this

public class StringLengthConvention : AttributePropertyConvention<StringLengthAttribute>
{
   protected override void Apply(StringLengthAttribute attribute, IPropertyInstance instance)
   {
       instance.Length(attribute.MaximumLength);
   }
}

Which can then be added to your mappings something like this

  .Mappings(m =>
            m.AutoMappings
                .Add(AutoMap.AssemblyOf<Show>(automappingConfiguration).Conventions.Setup(
                    c =>
                    {
                        c.Add<PrimaryKeyConvention>();
                        c.Add<CustomForeignKeyConvention>();
                        c.Add<StringLengthConvention>();
                    }
                    )))
Commonalty answered 8/6, 2023 at 12:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.