There are probably a couple ways to implement this. I don't think there's any construct in NHibernate that would allow you to do what you want through the mapping alone.
I would map all of the classes you list, with the appropriate properties for each class, mapping them directly to tables. In the Asset class, I'd have a List/Set/Dictionary collection that contains AttributeValues. If you'd rather a simpler way to access those values, you could write a helper method for a setter and getter that takes the name of the Attribute and the value for the AttributeValue and make the collection of AttributeValues private to hide the implementation completely from consumers of your Asset class.
I threw this together pretty quick, could probably be cleaned up.
Code:
public class Asset
{
public void SetValue(string attributeName, object value)
{
Attribute attribute = GetAttribute(attributeName);
if(attribute == null)
throw new ArgumentException("Could not locate attribute for this object type: " + attributeName);
Values[attribute.Name] = new AttributeValue(attribute, value);
}
public object GetValue(string attributeName)
{
Attribute attribute = GetAttribute(attributeName);
if(attribute == null)
throw new ArgumentException("Could not locate attribute for this object type: " + attributeName);
object ret;
Values.TryGetValue(attribute.Name, out ret);
return ret;
}
private static Attribute GetAttribute(string attributeName)
{
//TODO: Retrieve Attributes configured for this asset type
}
private IDictionary<string, AttributeValue> Values { get; set; }
}