When NHibernate throws an exception like this,
it includes the inner exception thrown by the ADO provider, which will,
99% of the time, say exactly what was wrong with the SQL statement that
failed. The inner exception is MUCH more helpful; NH just wraps it in
something more generic so you can catch the generic exception instead of
all possible provider-specific exceptions thrown by the actual ADO.NET
layer NH uses to transmit SQL.
From what you've shown, my number-one suspicion is that the columns
in the DB are not named exactly like your properties, and you are not
specifying different column names in the mapping. If you only specify
the property, the property and column names must be a match according to
the DB's collation (basically meaning the only possible difference
could be case and only in a case-insensitive DB).
One other thing, not related to the error: Your AddSet() function
doesn't allow for external transaction control, because each operation
is not just its own transaction, but its own session. This is generally a
bad idea, because if Set 1 and Set 2 must both be added, Set 1 is
inserted, then Set 2 fails, Set 1 will still be in the DB. Usually, you
have to be able to tell NHibernate that multiple operations should be
all-or-nothing, by allowing the code to obtain some Transaction or
UnitOfWork reference that it can pass into various repository methods to
identify a transactional context.