私はセッションあたりのトランザクションを使用して呼び出す場合:NHibernate:一時インスタンスを保存するときにID IDはどのように更新されますか?
をsession.SaveOrUpdate(エンティティ)
が修正:
session.SaveOrUpdateCopy(エンティティ)
..andエンティティですidentity-Id = 0の一時インスタンス。上記の行は、エンティティのIDを自動的に更新し、インスタンスを永続化しますか?それとも取引でそうするべきなのでしょうか?あるいは、私は何とかそれを明示的にコード化しなければならないのですか?
明らかに、データベース行のID(新しい、一時的なもの)は自動生成され、いくつかの数値として保存されますが、ここでは実際のパラメータインスタンスについて説明しています。ビジネスロジックのインスタンスです。
EDIT - 関連問題の、フォローアップ。
マッピング:
public class StoreMap : ClassMap<Store>
{
public StoreMap()
{
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Name);
HasMany(x => x.Staff) // 1:m
.Cascade.All();
HasManyToMany(x => x.Products) // m:m
.Cascade.All()
.Table("StoreProduct");
}
}
public class EmployeeMap : ClassMap<Employee>
{
public EmployeeMap()
{
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.FirstName);
Map(x => x.LastName);
References(x => x.Store); // m:1
}
}
public class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Name).Length(20);
Map(x => x.Price).CustomSqlType("decimal").Precision(9).Scale(2);
HasManyToMany(x => x.StoresStockedIn)
.Cascade.All()
.Inverse()
.Table("StoreProduct");
}
}
EDIT2
クラス定義:
public class Store
{
public int Id { get; private set; }
public string Name { get; set; }
public IList<Product> Products { get; set; }
public IList<Employee> Staff { get; set; }
public Store()
{
Products = new List<Product>();
Staff = new List<Employee>();
}
// AddProduct & AddEmployee is required. "NH needs you to set both sides before
// it will save correctly"
public void AddProduct(Product product)
{
product.StoresStockedIn.Add(this);
Products.Add(product);
}
public void AddEmployee(Employee employee)
{
employee.Store = this;
Staff.Add(employee);
}
}
public class Employee
{
public int Id { get; private set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public Store Store { get; set; }
}
public class Product
{
public int Id { get; private set; }
public string Name { get; set; }
public decimal Price { get; set; }
public IList<Store> StoresStockedIn { get; private set; }
}
興味深いです。foreachが各アイテムにSaveを呼び出すことでコレクションを保存すると、すべての保存がデータベースにヒットしますか?完全な行はセッションに保存されますか?保存しますか? – bretddog
私はそれをプロファイラで再確認する必要がありますが、それは非常にうまくいくかもしれません。 –