views:

41

answers:

2

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)
}
A: 

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

Goblin
how does one set the length of a property?
Dusty Roberts
Map(x => x.<property>).Length(10000) :-)
Goblin
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 though
Dusty Roberts
Ahh - I missed the AutoMapping part, sorry about that. See this blogpost for how to achieve it for a single property: http://serialseb.blogspot.com/2009/01/fluent-nhibernate-and-nvarcharmax.html
Goblin
+1  A: 

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
    }
Jay
thanx m8, after little configuration and using your example it worked like a charm..
Dusty Roberts