1

I have a Task entity with various navigation properties, including a Comment entity:

public Comment { 
  public int ID { get; set; }
  public string Title { get; set; }
  public string Description { get; set; }
  public DateTime CreateDate { get; set; }
  public DateTime LastEditedDate { get; set; }
  public virtual User User { get; set; }
}

A comment can be edited, and I want to keep a history of all such changes. Think of the way Stackoverflow allows you to edit your questions/comments, but keeps a history of changes.

Keeping a history means more complexity, and it becomes harder to maintain. My options:

  • add properties such as public virtual ICollection<string> DescriptionHistory { get; set; }, and a similar one for Title, User, EditDate, etc. It gets out of hand very quickly.

  • keep the Title, Description, etc. properties as strings, but make them CSV strings and stuff all those changes into a fewer set of properties. This means more processing, but the entity is simpler. The problem is that it becomes tricky to associate one CSV fragment with the corresponding one from a different property, eg a historical title must match its historical description and date.

  • do both, have the current set of properties, and another single set of nullables like TitleHistory, DescriptionHistory, etc., which are CSV strings of older versions, and so it only gets complicated when you are dealing with the historical stuff.

Also there are problems around the storage of the user, unless I use a CSV of IDs rather than the entities.

What is the best approach to this problem? There are various techniques such as sprocs and "insert only" tables - but I am using Entity Framework 5, and so prefer a solution which leverages the technology I am already using.

Community
  • 1
  • 1
Bobby B
  • 2,287
  • 2
  • 24
  • 47

1 Answers1

0

I've settled on using an "insert only" table. Pity it's not easy to do with EF5.

Bobby B
  • 2,287
  • 2
  • 24
  • 47