I think some advanced relationships that are possible with RDF are probably not possible in the confines of C# classes/interfaces.
I think that your model could be quite close to what you outline:
Define ICharacter and ISpecies as interfaces.
ICharacter has a Species property which returns an instance that implements the ISpecies interface.
Then on your ISpecies class you would define properties that specify common species characteristics such as a base movement rate.
Human might have additional properties and actually in B*, that is OK - you can split those other properties out into other interface and then use the casting mechanism to change the EF class you bind to at runtime (see
Another thing to mention is that you can also extend the generated class as it is deliberately generated as a partial class. So lets say for example that you want to allow characters to have a movement bonus that might vary from character to character; you
could add a property to ICharacter to record this bonus; and then add a method to the Character class to return the base movement rate + the movement bonus. Hopefully you can see what I mean!
Walking and other such actions I often model as events. So I might have an IEvent base interface with properties like Start, End (or Duration). Then you can create derived interfaces such as MovementEvent which might add properties like FromLocation, ToLocation
and Rate. Again you could make use of methods added to the derived classes to do things like calculate and update the Duration of an event based on other information (like the distance between FromLocation and ToLocation and the Rate of movement). By capturing
events you can do things such as create dependencies between events (e.g. event B starts after event A completes) or create hierarchies of events (e.g. event A consists of sub-events B and C), and so you can start to get some useful flexibility out of it.
You could take a look at
for some inspiration for a simple but quite flexible event model.
Finally I would also say that if you find EF to be a bottleneck, it might be worth taking the time to learn SPARQL and use SPARQL and our DataObjects API - this is more low-level (no LINQ, so you need SPARQL for the queries), but much more flexible and it maps
to dynamic objects in C# so it may end up being easier to work with and modify as your requirements develop.
Hope this helps!