Nice work for a first go. Depending on how you've wired up, fields, the fact that they hare readonly
and lack of a parameterless public constructor are likely to cause issues with most serialization mechanisms - i.e. make them auto properties.
While I generally like to protect invariants by constraining stuff as you have, it's important to balance this with the fact that an event, once it has happened is fully baked - so a POCO with writable properties isnt as crazy as you'd think.
One other thing I'd do is get rid of the ids out of the events.
(And go join the DDD-CQRS mailing list - there's a recent discussion that touched on the notion of fat events - i.e. restating stuff that can be gleaned from previous events [on the basis that you know what an event handler needs to react to an event] which I agree is a bad idea).
I must post my AggregateBase
- there's a of subtleties you got right but lots of litle things I'd change. Poke me in a week if I haven't done it sooner...