Ah, I see what's wrong. You fetch 'role' in the same query as where you pass it to the Role property of UserRole. This can't be done, as the projection is the area where entity materialization occurs, and therefore 'role' isn't something that exists at the time the UserRoleEntity instances are materialized, so as you'll see, the Role property is null after the query.
LLBLGen Pro uses two fetch pipelines, one for entities and one for all other projections. The one for entities is enhanced in that it can detect inheritance over multiple tables and therefore add additional relations etc. The custom projection one, doesn't do that and doesn't know how to fetch entities, and your query uses that pipeline, even though you materialize entity class instances. The entity fetch pipeline is not requiring 'new' in the projection, you simply select an entity you refer to in the query for example:
var q = from c in metaData.Customer where c.Country=="USA" select c;
though:
var q = from c in metaData.Customer where c.Country=="USA" select new { c.CustomerId };
or
var q = from c in metaData.Customer where c.Country=="USA" select c.CustomerId;
don't fetch entities and therefore use the other pipeline, even though the materialized class is an entity class.
For example this also doesnt work:
var q = from c in metaData.Customer where c.Country=="USA" select new {Foo = SomeInMemoryMethod(c)};
as 'c' is passed to an in-memory method, but 'c' is not a real entity object when the projection runs.
This might sound confusing, and actually it is, though it's very hard for us to solve this, as the linq provider converts to our query api and not to raw SQL which is fed to 1 pipeline, as entity fetching is much more difficult than simply projecting a resultset to a list of classes: additional features kick in when an entity is fetched for example, so the runtime has to know what's fetched: entities or some random other object. This is done in the API by either using for example GetMulti() on a collection (entity pipeline), or by fetching a projection or dynamic list (other pipeline).