हमने एनएच के साथ इवेंट श्रोताओं का उपयोग करके ऐसा किया (यह मेरा काम नहीं है - लेकिन मुझे यह लिंक नहीं मिला है कि मैंने इसे कहाँ किया ...)।और फिर सहेजें (और SaveOrUpdate) के लिए उन्हें एक के रूप में स्थापित करने के लिए भरी हुई है, इसलिए कि वस्तु बना रहेगा जब हम स्वयं उस पर Save()
कहते हैं -
हम जब डेटा में पढ़ना, केवल पठनीय के रूप में सेट करने के लिए एक EventListener है ।
वह - या आप एक IStatelessSession का उपयोग कर सकते हैं जिसमें कोई राज्य/चेंजट्रैकिंग नहीं है।
यह इकाई/आइटम को तुरंत लोड होने पर तुरंत पढ़ने के रूप में सेट करता है।
मैंने केवल एक सम्मिलन ईवेंट श्रोता शामिल किया है, लेकिन मेरा कॉन्फ़िगरेशन कोड उन सभी का संदर्भ देता है।
/// <summary>
/// A listener that once an object is loaded will change it's status to ReadOnly so that
/// it will not be automatically saved by NH
/// </summary>
/// <remarks>
/// For this object to then be saved, the SaveUpdateEventListener is to be used.
/// </remarks>
public class PostLoadEventListener : IPostLoadEventListener
{
public void OnPostLoad(PostLoadEvent @event)
{
EntityEntry entry = @event.Session.PersistenceContext.GetEntry(@event.Entity);
entry.BackSetStatus(Status.ReadOnly);
}
}
वस्तु बचत पर, हम इस फोन लोडेड है कि वस्तु स्थापित करने के लिए (अर्थात यह अब बना रहेगा)
public class SaveUpdateEventListener : ISaveOrUpdateEventListener
{
public static readonly CascadingAction ResetReadOnly = new ResetReadOnlyCascadeAction();
/// <summary>
/// Changes the status of any loaded item to ReadOnly.
/// </summary>
/// <remarks>
/// Changes the status of all loaded entities, so that NH will no longer TrackChanges on them.
/// </remarks>
public void OnSaveOrUpdate(SaveOrUpdateEvent @event)
{
var session = @event.Session;
EntityEntry entry = session.PersistenceContext.GetEntry(@event.Entity);
if (entry != null && entry.Persister.IsMutable && entry.Status == Status.ReadOnly)
{
entry.BackSetStatus(Status.Loaded);
CascadeOnUpdate(@event, entry.Persister, @event.Entry);
}
}
private static void CascadeOnUpdate(SaveOrUpdateEvent @event, IEntityPersister entityPersister,
object entityEntry)
{
IEventSource source = @event.Session;
source.PersistenceContext.IncrementCascadeLevel();
try
{
new Cascade(ResetReadOnly, CascadePoint.BeforeFlush, source).CascadeOn(entityPersister, entityEntry);
}
finally
{
source.PersistenceContext.DecrementCascadeLevel();
}
}
}
और हम इस प्रकार तो राष्ट्रीय राजमार्ग में इसे लागू:
public static ISessionFactory CreateSessionFactory(IPersistenceConfigurer dbConfig, Action<MappingConfiguration> mappingConfig, bool enabledChangeTracking,bool enabledAuditing, int queryTimeout)
{
return Fluently.Configure()
.Database(dbConfig)
.Mappings(mappingConfig)
.Mappings(x => x.FluentMappings.AddFromAssemblyOf<__AuditEntity>())
.ExposeConfiguration(x => Configure(x, enabledChangeTracking, enabledAuditing,queryTimeout))
.BuildSessionFactory();
}
/// <summary>
/// Configures the specified config.
/// </summary>
/// <param name="config">The config.</param>
/// <param name="enableChangeTracking">if set to <c>true</c> [enable change tracking].</param>
/// <param name="queryTimeOut">The query time out in minutes.</param>
private static void Configure(NHibernate.Cfg.Configuration config, bool enableChangeTracking, bool enableAuditing, int queryTimeOut)
{
config.SetProperty(NHibernate.Cfg.Environment.Hbm2ddlKeyWords, "none");
if (queryTimeOut > 0)
{
config.SetProperty("command_timeout", (TimeSpan.FromMinutes(queryTimeOut).TotalSeconds).ToString());
}
if (!enableChangeTracking)
{
config.AppendListeners(NHibernate.Event.ListenerType.PostLoad, new[] { new Enact.Core.DB.NHib.Listeners.PostLoadEventListener() });
config.AppendListeners(NHibernate.Event.ListenerType.SaveUpdate, new[] { new Enact.Core.DB.NHib.Listeners.SaveUpdateEventListener() });
config.AppendListeners(NHibernate.Event.ListenerType.PostUpdate, new[] { new Enact.Core.DB.NHib.Listeners.PostUpdateEventListener() });
config.AppendListeners(NHibernate.Event.ListenerType.PostInsert, new[] { new Enact.Core.DB.NHib.Listeners.PostInsertEventListener() });
}
}
हाँ, लेकिन जब भी मैं फ्लश करता हूं तब भी यह तब भी होगा। –
आह, फिर सत्र करके ऑब्जेक्ट क्षणिक बनाओ। एक्टिक्ट() –
मुझे लगता है कि मुझे लगता है कि निबर्ननेट मुझे मैन्युअल रूप से अद्यतनों को नियंत्रित नहीं करना चाहता, ये सभी समाधान हैक की तरह लगते हैं। यह क्यों है? –