मैं पहले की इकाई को अद्यतन नहीं कर सकता। मैं संदेश के साथ एक StaleObjectException
अपवाद हो रही है:अद्यतन इकाइयों को कैसे संभालें। एनएचबीर्नेट + एएसपी.नेट एमवीसी
Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [Project.DomainLayer.Entities.Employee#00000000-0000-0000-0000-000000000000]
मैं किसी के साथ अद्यतन प्रक्रिया का हिस्सा नहीं है। समस्या क्या है?
डेटा एक्सेस/डि
public class DataAccessModule : Ninject.Modules.NinjectModule
{
public override void Load()
{
this.Bind<ISessionFactory>()
.ToMethod(c => new Configuration().Configure().BuildSessionFactory())
.InSingletonScope();
this.Bind<ISession>()
.ToMethod(ctx => ctx.Kernel.TryGet<ISessionFactory>().OpenSession())
.InRequestScope();
this.Bind(typeof(IRepository<>)).To(typeof(Repository<>))
.InRequestScope();
}
}
डेटा एक्सेस/मैपिंग
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Project.DomainLayer" namespace="Project.DomainLayer.Entities">
<class name="Employee" optimistic-lock="version">
<id name="ID" column="EmployeeID" unsaved-value="00000000-0000-0000-0000-000000000000">
<generator class="guid.comb" />
</id>
<version name="Version" type="Int32" column="Version" />
<!-- properties -->
<property name="EmployeeNumber" />
<!-- ... -->
<property name="PassportRegistredOn" not-null="true" />
<!-- sets -->
<set name="AttachedInformation" cascade="all">
<key column="EmployeeID" />
<element column="Attachment" />
</set>
<set name="TravelVouchers" cascade="all">
<key column="EmployeeID" />
<one-to-many class="TravelVoucher" />
</set>
</class>
</hibernate-mapping>
डेटा एक्सेस/भंडार
public class Repository<T> : IRepository<T> where T : AbstractEntity<T>, IAggregateRoot
{
private ISession session;
public Repository(ISession session)
{
this.session = session;
}
// other methods are omitted
public void Update(T entity)
{
using(var transaction = this.session.BeginTransaction())
{
this.session.Update(entity);
transaction.Commit();
}
}
public void Update(Guid id)
{
using(var transaction = this.session.BeginTransaction())
{
this.session.Update(this.session.Load<T>(id));
transaction.Commit();
}
}
}
एक नियंत्रक
public class EmployeeController : Controller
{
private IRepository<Employee> repository;
public EmployeeController(IRepository<Employee> repository)
{
this.repository = repository;
}
public ActionResult Edit(Guid id)
{
var e = repository.Load(id);
return View(e);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Employee employee)
{
if(ModelState.IsValid)
{
repository.Update(employee);
return RedirectToAction("Deatils", "Employee", new { id = employee.ID });
}
else
{
return View(employee);
}
}
}
मैं अपने संस्थाओं को कैसे अपडेट कर अंदर? धन्यवाद!
संपादित
तो मैं अपने मार्कअप को unsaved-value="{Guid.Empty goes here}"
गयी। इसके अलावा मैं अगली बात करने की कोशिश की है:
public void Update(T entity)
{
using(var transaction = this.session.BeginTransaction())
{
try
{
this.session.Update(entity);
transaction.Commit();
}
catch(StaleObjectStateException ex)
{
try
{
session.Merge(entity);
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}
}
}
और यह मुझे एक ही प्रभाव देता है .. मेरा मतलब है transaction.Commit();
Merge
के बाद एक ही अपवाद देता है।
इसके अलावा मुझे आश्चर्य है कि छिपे हुए इनपुट का उपयोग करके, पर Edit
दृश्य पर मुझे खुलासा करना चाहिए?
संपादित
तो इकाई वास्तव में अलग हो जाता है। जब यह नियंत्रक को पास करता है ID
Guid.Empty
के बराबर होता है। मैं इसे कैसे संभालूं, Merge
या Reattach
?
क्या आप जेनरेट किए गए कुछ एसक्यूएल पोस्ट कर सकते हैं? साथ ही, क्या आपने सत्यापित किया है कि कर्मचारियों की इकाई के पास पोस्ट पर एक आईडी है? – shanabus