Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6040515
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 23, 20262026-05-23T06:31:29+00:00 2026-05-23T06:31:29+00:00

I’m trying to implement an IUserType for states and country codes that will allow

  • 0

I’m trying to implement an IUserType for states and country codes that will allow me to access both the two-letter code (what’s stored in the database) as well as the full name. I’m following the example in the NHibernate 3.0 Cookbook (p. 225), but my problem is that my StreetAddress class is currently mapped as a component in my automapping configuration:

public override bool IsComponent(Type type)
{
    return type == typeof(StreetAddress);
}

With this class identified as a component, I don’t know how I can use an IUserType for the component class’s property, since that class isn’t explicitly mapped. There’s nowhere that I could tell fluent NHibernate to use the IUserType specification.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-23T06:31:30+00:00Added an answer on May 23, 2026 at 6:31 am

    @Firo was close, but there turned out to be a much easier solution. There were two steps here. First, I had to tell Fluent NHibernate not to map the State and Country classes, which reside in my domain layer:

    public override bool ShouldMap(Type type)
    {
        return type.Name != "State" && type.Name != "Country";
    }
    

    Next, I simply had to create the conventions for the IUserType classes. This turned out to be easier than @Firo suggested:

    public class CountryUserTypeConvention : UserTypeConvention<CountryType>
    {
    }
    
    public class StateUserTypeConvention : UserTypeConvention<StateType>
    {
    }
    

    The definition of those IUserTypes was pulled out of the cookbook referenced in the original question, but in case you don’t want to read it:

    public class CountryType : GenericWellKnownInstanceType<Country, string>
    {
        // The StateType is pretty much the same thing, only it uses "StateCode" instead of "CountryCode"
        private static readonly SqlType[] sqlTypes =
            new[] {SqlTypeFactory.GetString(2)};
    
        public CountryType()
            : base(new Countries(),
                   (entity, id) => entity.CountryCode == id,
                   entity => entity.CountryCode)
        {
        }
    
        public override SqlType[] SqlTypes
        {
            get { return sqlTypes; }
        }
    }
    

    And that derives from GenericWellKnownInstanceType:

    [Serializable]
    public abstract class GenericWellKnownInstanceType<T, TId> :
        IUserType where T : class
    {
        private Func<T, TId, bool> findPredicate;
        private Func<T, TId> idGetter;
        private IEnumerable<T> repository;
    
        protected GenericWellKnownInstanceType(
            IEnumerable<T> repository,
            Func<T, TId, bool> findPredicate,
            Func<T, TId> idGetter)
        {
            this.repository = repository;
            this.findPredicate = findPredicate;
            this.idGetter = idGetter;
        }
    
        public Type ReturnedType
        {
            get { return typeof (T); }
        }
    
        public bool IsMutable
        {
            get { return false; }
        }
    
        public new bool Equals(object x, object y)
        {
            if (ReferenceEquals(x, y))
            {
                return true;
            }
            if (ReferenceEquals(null, x) ||
                ReferenceEquals(null, y))
            {
                return false;
            }
            return x.Equals(y);
        }
    
        public int GetHashCode(object x)
        {
            return (x == null) ? 0 : x.GetHashCode();
        }
    
        public object NullSafeGet(IDataReader rs,
                                  string[] names, object owner)
        {
            int index0 = rs.GetOrdinal(names[0]);
            if (rs.IsDBNull(index0))
            {
                return null;
            }
            var value = (TId) rs.GetValue(index0);
            return repository.FirstOrDefault(x =>
                                             findPredicate(x, value));
        }
    
        public void NullSafeSet(IDbCommand cmd,
                                object value, int index)
        {
            if (value == null)
            {
                ((IDbDataParameter) cmd.Parameters[index])
                    .Value = DBNull.Value;
            }
            else
            {
                ((IDbDataParameter) cmd.Parameters[index])
                    .Value = idGetter((T) value);
            }
        }
    
        public object DeepCopy(object value)
        {
            return value;
        }
    
        public object Replace(object original,
                              object target, object owner)
        {
            return original;
        }
    
        public object Assemble(object cached, object owner)
        {
            return cached;
        }
    
        public object Disassemble(object value)
        {
            return value;
        }
    
        /// <summary>
        /// The SQL types for the columns
        /// mapped by this type.
        /// </summary>
        public abstract SqlType[] SqlTypes { get; }
    }
    

    The repositories for these classes are just a pair of ReadOnlyCollection of the State and Country objects. Again, from the cookbook:

    public class States : ReadOnlyCollection<State>
    {
        // Truncated in the interest of brevity
        public static State Arizona = new State("AZ", "Arizona");
        public static State Florida = new State("FL", "Florida");
        public static State California = new State("CA", "California");
        public static State Colorado = new State("CO", "Colorado");
        public static State Oklahoma = new State("OK", "Oklahoma");
        public static State NewMexico = new State("NM", "New Mexico");
        public static State Nevada = new State("NV", "Nevada");
        public static State Texas = new State("TX", "Texas");
        public static State Utah = new State("UT", "Utah");
    
        public States() : base(new State[]
                                   {
                                       Arizona, Florida, California, Colorado,
                                       Oklahoma, NewMexico, Nevada, Texas, Utah
                                   }
            )
        {
        }
    }
    

    Hopefully this helps someone out there.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

No related questions found

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.