title: Concerned about the size of my Aggregate Root
body: <p>I am new to DDD and have a concern about the size of my Aggregate Root. The object graph is like the image below. (They are collections). The problem is all of the entities depend on the state of the AggregateRoot (Event). My question is: how do I break the aggregate into smaller aggregates? It's like I have a "God" like aggregate root that just manages everything. </p>
  
  <p>This is very simplistic view of my domain: </p>
  
  <p><img src="https://i.stack.imgur.com/vbZry.jpg" alt="enter image description here"></p>
  
  <p>and these are the rules: </p>
  
  <ul>
  <li>An event has a number of different states. (implemented state design
  pattern here).</li>
  <li>An event has a collection of sessions. (but only 1 can be active at a time and only if the event is in the correct state).  </li>
  <li>A session has two states: Active and Ended.  </li>
  <li>A session has a collection of Guests.  </li>
  <li>A session has a collection of photos. (Maximum
  of 10).</li>
  <li>When a session is deleted. It should delete all its children. </li>
  <li>When a session has ended and a photo is deleted it should
  check to see if there are any other photos that belong to the
  session. If not it should also delete the session.</li>
  <li>When a session has ended and a photo is deleted sometimes it should throw an exception depending on the state of the event. </li>
  <li>When a session is active and a photo is deleted. It should not worry about whether or not the session has any other photos or not. </li>
  <li>When a session ends it must have at least 1 photo and at least 1 guest. </li>
  <li>A photo can be updated but only if the event is in the right state. </li>
  <li>When an event is deleted it should delete all its children. </li>
  </ul>
  
  <p>Edit: I have divided the 1 aggregate into smaller aggregates so that Event, Session and Photo are all ARs. The issues is a session needs to perform a check on the Event AR before starting. Is it perfectly ok to inject an event object into the sessions start method Session.Start(Event @event) or will I have concurrency issues as outlined in some of the comments?  </p>