Is LogMessages Persistent? If so, it's best to never publish a public setter. NHibernate gets weird if you return from the database and then replace this IList with a new one:
var myLog = session.Get<LogRun>(1); Assert.True(myLog.LogMessages.Count > 0); myLog.LogMessages = new List<Log>();
If you notice that NHibernate returns a proxied object and replaces it with a shared list, it will depend on trying to save it.
As a rule, I prefer to have a private field, which I initialize, and then expose the client only getter:
public class LogRun { private IList<Log> logMessages = new List<Log>(); public virtual int Id { get; private set; } public virtual DateTime StartTime { get; set; } public virtual DateTime EndTime { get; set; } public virtual IList<Log> LogMessages { get { return logMessages; } } public virtual int LogMessageCount { get { return LogMessages.Count; } } public void AddLogMessage(Log log) { logMessages.Add(log); } }
In fact, I take a step further, the client receives an IEnumerable <> and I add a helper function to add.
My introduction will look like
public class LogRun { private IList<Log> logMessages = new List<Log>(); public virtual int Id { get; private set; } public virtual DateTime StartTime { get; set; } public virtual DateTime EndTime { get; set; } public virtual IEnumerable<Log> LogMessages { get { return logMessages; } } public virtual int LogMessageCount { get { return LogMessages.Count(); } } public void AddLogMessage(Log log) { logMessages.Add(log); } }
Ben
source share