Defining Access Strategy in FluentNHibernate

I am posting this because it took me a little while (longer than it should have) to figure out how to define the access strategy for an domain object’s fields or properties. The documentation for FluentNHibernate is still fairly basic, and Googling for the answer didn’t get me anywhere. In the end I figured it out from Visual Studio’s intellisense (which frankly is where I should have looked in the first place).

For all those like me who decide to Google first, here is the answer.

A number of the *Part classes in the FluentNHibernate.Mapping namespace implement the IAccessStrategy(Of ComponentPart(Of T)) interface. This interface defines one property, Access which returns an AccessStrategyBuilder(Of T) object. The AccessStrategyBuilder object has a number of methods used to define the access strategy:

  • AsCamelCaseField
  • AsField
  • AsLowerCaseField
  • AsPascalCaseField
  • AsProperty
  • AsReadOnlyPropertyThroughCamelCaseField
  • AsReadOnlyPropertyThroughLowerCaseField
  • AsReadOnlyPropertyThroughPascalCaseField

This information I found relatively quickly. What I was missing was how to specify that my camel case fields are prefixed with the underscore character. But all of the CamelCase, LowerCase and PascalCase variations of the methods listed above have an overload which accepts an instance of a Prefix object, of which there are 4 variations:

  • m
  • mUnderscore
  • None
  • Underscore

So in the end, my mapping is as follows:

WithTable("client")

Id(Function(c) c.ID, "id").WithUnsavedValue(0).GeneratedBy.Identity()

Map(Function(c) c.AccountName).TheColumnNameIs("account_name")
Map(Function(c) c.Company).TheColumnNameIs("company")
Map(Function(c) c.Created).TheColumnNameIs("created")
Map(Function(c) c.Updated).TheColumnNameIs("updated")
Map(Function(c) c.UseAdministrativeContactAsBillingContact).TheColumnNameIs("blg_is_adm")

Component(Of Client)(Function(c) c.AdministrativeContact, _
                     AddressOf MapAdministrativeContact).Access.AsCamelCaseField(Prefix.Underscore)
Component(Of Client)(Function(c) c.BillingContact, _
                     AddressOf MapBillingContact).Access.AsCamelCaseField(Prefix.Underscore)