Skip to content

CHR0018: Constraint Define() must not contain imperative code

The Define() method of a class implementing IConstraint must not contain imperative statements such as if/else, loops, variable declarations, or assignments. Constraint definitions only declare rules; they do not execute.

Error

using Cratis.Chronicle.Events.Constraints;
public class UniqueEmailConstraint : IConstraint
{
public void Define(IConstraintBuilder builder)
{
if (someCondition)
{
builder.Unique<UserRegistered>();
}
}
}
using Cratis.Chronicle.Events.Constraints;
public class UniqueEmailConstraint : IConstraint
{
public void Define(IConstraintBuilder builder) =>
builder.Unique<UserRegistered>();
}

The Define() method is called once at registration time to declare constraint rules. The resulting definition is serialized and sent to the server. Imperative code such as conditionals or loops creates non-determinism: different runs could produce different constraint definitions, breaking consistency.

  • CHR0017: Constraint must not have side effects
  • CHR0016: Projection Define() must not contain imperative code