【发布时间】:2015-01-09 15:31:59
【问题描述】:
这是我的基本 nHibernate 实体:
public class Patients
{
public virtual int Id { get; protected set; }
public virtual string First_Name { get; set; }
public virtual string Last_Name { get; set; }
public virtual string Pesel { get; set; }
public virtual string Gender { get; set; }
public virtual string Height { get; set; }
public virtual string Comments { get; set; }
public virtual Adresses Address { get; set; }
public virtual Adresses CorrespondencyAddress { get; set; }
public virtual StudyPayer DefaultPayer { get; set; }
public virtual DateTime? BirthDate { get; set; }
public virtual string PhoneNumber { get; set; }
public virtual DateTime RegistrationDate { get; set; }
public virtual string Citizenship { get; set; }
public virtual string Country_Region { get; set; }
public virtual string EMail { get; set; }
public virtual string Doc_Id_Number { get; set; }
}
这里是患者中引用的地址实体:
public class Adresses
{
public virtual int Id { get; protected set; }
public virtual string Street { get; set; }
public virtual string HomeNumber { get; set; }
public virtual string PostalCode { get; set; }
public virtual string City { get; set; }
public virtual string Country { get; set; }
}
在我的代码中,我为患者添加了一个地址,然后我想同时插入这两个地址:
Patients pacjent = new Patients();
pacjent.First_Name = model.First_Name;
pacjent.Last_Name = model.Last_Name;
Adresses corAddress = new Adresses();
corAddress.City = model.CityCorrespondency;
corAddress.HomeNumber = model.HouseNumberCorrespondency;
corAddress.PostalCode = model.PostCodeCorrespondency;
corAddress.Street = model.StreetCorrespondency;
pacjent.CorrespondencyAddress = corAddress;
在数据库层至少需要 2 次插入或更新。
问题是我是否需要将其保存在事务中:
using (var transaction = session.BeginTransaction())
{
transaction.Begin();
session.SaveOrUpdate(pacjent);
transaction.Commit();
}
或者干脆 nHibernate 处理事务:
session.SaveOrUpdate(pacjent);
【问题讨论】:
-
如果你想拥有可靠的软件,除了使用ACID事务之外别无选择。其他任何事情都将永远是危险的。可以,但不应该在没有事务的情况下调用 WRITE...
-
我知道 ACID,但我的问题是 nHibernate 是否会在这种特定情况下处理事务:一次调用 SaveOrUpdate() 但两次插入数据库。
-
答案是否定的。 NHibernate 将使用隐式事务处理,即每个语句都有自己的 ACID 解决方案。也就是说,如果您不将其包装在 EXPLICIT 事务中,则可能会发生一个 INSERT 或 UPDATE 会成功,而另一个则不会。所以,永远不要使用隐含的。始终将其包装在事务中。更重要的是,真正的 INSERT UPDATE 与 Save() 无关,而是与 session.Flush()...
-
谢谢。我只是在实际情况下检查过:)
-
很高兴看到这一点。我相信您会在 COMPLETE 请求结束时正确启动事务并提交它。 ;) 这会给你你需要的水果 ;)
标签: nhibernate