public abstract class AppUser { public Guid Id { get; set; } } public class RegisteredUser : AppUser { public void Apply(Registered registered) { Username = registered.Username; } // remove this projection when user is disabled internal bool ShouldDelete(Disabled _) => true; public string Username { get; set; } } public class DisabledUser : AppUser { // start this projection when user is disabled public void Apply(Disabled disabled) { UserName = disabled.Username } public string Username { get; set; } } services.AddMarten(options => { options.Schema.For() .AddSubClass() .AddSubClass(); }); // register user, then disable it as both events are on the same stream var registered = new Registered(username); var disabled = new Disabled(username); // store events session.Events.StartStream(streamId, registered, disabled); await session.SaveChangesAsync(); var user = session.Load(streamId); // (AppUser is DisabledUser)-> true var users = session.Query().ToList(); // Count -> 1 var registeredUser = session.Load(streamId); // -> null var disabledUser = session.Load(streamId); // -> not null