I used to have a base Entity class, providing Dirty/Removed Logic.
When writing Entity-subclasses, you could do something like:
public string Name
{
get { return name; }
set { setValue("Name", value); }
}
This works fine, but has the 'ugly string' disease...
Today you can use Lambda Expressions to exclude the strings:
set {setValue(x => x.Name, value);}
Or, and I think that this is the best solution, you could use AOP:
https://www.postsharp.net/
This way, you can define actions by Attributes. You create an attribute and specify that when the user changes the associated property, the entity becomes dirty.
Additionally, you can keep a list of properties in your class (base Entity) which will remember the changed properties, and access that list from your AOP Code.