私はNhibernate 3.2を使用しており、流暢なnhibernateを使用しています。顧客グループと顧客テーブルが2つあり、タイムスタンプ列によるロック管理バージョン管理に使用します。 私は、これらのクラスのための次のクラスとマップを持っている:バージョン管理でバッチ更新、削除、挿入が正しく動作しない
public class Customer
{
public Customer()
{
}
public virtual int CustomerID { get; set; }
public virtual CustomerGroup customerGroup { get; set; }
public virtual int CustomerGroupID { get; set; }
public virtual string CustomerRef { get; set; }
public virtual string NameE { get; set; }
public virtual string NameA { get; set; }
public virtual byte[] TimeStamp { get; set; }
}
と彼のマップを
public class CustomerMap : ClassMap<Customer> {
public CustomerMap() {
Table("Customer");
Id(x => x.CustomerID).GeneratedBy.Identity().Column("CustomerID");
Version(x =>x.TimeStamp).CustomType("BinaryBlob").Generated.Always().Column("TimeStamp");
DynamicUpdate();
OptimisticLock.Version();
References(x =>x.customerGroup).Column("CustomerGroupID").ForeignKey("CustomerGroupID");
Map(x => x.CustomerRef).Column("CustomerRef").Length(30).Unique();
Map(x => x.NameE).Column("NameE").Not.Nullable().Length(100).Unique();
Map(x => x.NameA).Column("NameA").Length(100);
と顧客グループのため
:public class CustomerGroup {
public CustomerGroup() {
Customers = new List<Customer>(3);
}
public virtual int CustomerGroupID { get; set; }
public virtual IList<Customer> Customers { get; set; }
public virtual byte[] TimeStamp { get; set; }
}
と彼のマップ:
public CustomerGroupMap() {
Table("CustomerGroup");
Version(x => x.TimeStamp).CustomType("BinaryBlob").Generated.Always().Column("TimeStamp");
DynamicUpdate();
OptimisticLock.Version();
Id(x => x.CustomerGroupID).GeneratedBy.Identity().Column("CustomerGroupID");
HasMany(x => x.Customers).KeyColumn("CustomerGroupID");
}
Whe nは私はこのような特定の顧客グループに属している顧客のリストに更新を作成します。
UPDATE Customer SET NameE = 'abc'
WHERE CustomerID = 200 AND TimeStamp = 0x00000000000092EF
SELECT customer_.TimeStamp as TimeStamp1_ FROM Customer customer_
WHERE customer_.CustomerID = 200
UPDATE Customer SET NameE = 'abc'
WHERE CustomerID = 201 AND TimeStamp = 0x00000000000092F0
SELECT customer_.TimeStamp as TimeStamp1_ FROM Customer customer_
WHERE customer_.CustomerID = 201
:
ISession Session = OpenSession();
Session.BeginTransaction();
var customerGroupInfo = Session.Query<CustomerGroup>().Fetch(x => x.Customers).Single<CustomerGroup>(x => x.CustomerGroupID == 98);
foreach (var item in customerGroupInfo.Customers)
{
item.NameE = "abc";
Session.Update(item);
}
Session.Transaction.Commit();
は、これらのSQL文を適用します。 。 。
すべてのアップデートとすべての選択は、1回の往復で動作します。 は、私はこのような構成のプロパティadonet.batch_sizeプロパティを設定します。
<property name="adonet.batch_size">20</property>
私はthis postにNHibernateは3.2でデフォルトによって設立され、この動作をお読みください。 バッチを正しく作成するためのヒント
は、私はあなたのコードを試しても正常に動作しない、あなたの答えをいただき、ありがとうございます。 –
私のプロジェクトでは.Net 3.5を使用しています。 –
ADO.Netのバージョンはコンパイルする.NETバージョンと同じではないと思います。 Googleは、ADO.Net 3.5は主にEFに関するものだと言いますが、これはNHがフックできるとは思っていません。 – Origin