NHibernate - Tải / Nhận
Trong chương này, chúng ta sẽ trình bày về cách hoạt động của các tính năng Load và Get và cách chúng ta có thể sử dụng chúng. Đây là hai API rất giống nhau được cung cấp bởiISession để tải một đối tượng bằng khóa chính.
Get - nó sẽ trả về đối tượng hoặc giá trị null.
Load - nó sẽ trả về đối tượng hoặc nó sẽ ném một ObjectNotFoundException.
Bây giờ, tại sao chúng ta có hai API khác nhau này?
Tải
Đó là vì Tải có thể tối ưu hóa các chuyến đi vòng quanh cơ sở dữ liệu hiệu quả hơn nhiều.
Tải thực sự trả về một đối tượng proxy và không cần truy cập cơ sở dữ liệu ngay khi bạn thực hiện lệnh gọi Tải đó.
Khi bạn truy cập proxy đó, đối tượng không có trong cơ sở dữ liệu, nó có thể ném một ObjectNotFoundException vào thời điểm đó.
Được
Ngược lại, với Nhận vì những hạn chế của CLR hoặc Common Language Runtime và NHibernate phải đi đến cơ sở dữ liệu ngay lập tức, kiểm tra xem các đối tượng có ở đó không và trả về null, nếu nó không hiện diện.
Nó không có tùy chọn đối tượng trì hoãn lần tìm nạp đó, vòng quay đó đến cơ sở dữ liệu sau đó vì nó không thể trả về một đối tượng proxy và đã hoán đổi đối tượng proxy đó thành null, khi người dùng thực sự truy cập vào nó.
Hãy xem một ví dụ đơn giản, trong đó bạn sẽ thấy chúng được sử dụng như thế nào và sự khác biệt giữa Get và Load. Chúng tôi sẽ tiếp tục với các lớp miền tương tựCustomers và Orders và tương tự các tệp ánh xạ tương tự từ chương trước.
Trong ví dụ này, đầu tiên chúng ta sẽ sử dụng Get như trong chương trình sau.
using System;
using System.Data;
using System.Linq;
using System.Reflection;
using HibernatingRhinos.Profiler.Appender.NHibernate;
using NHibernate.Cfg;
using NHibernate.Criterion;
using NHibernate.Dialect;
using NHibernate.Driver;
using NHibernate.Linq;
namespace NHibernateDemo {
internal class Program {
private static void Main() {
var cfg = ConfigureNHibernate();
var sessionFactory = cfg.BuildSessionFactory();
using(var session = sessionFactory.OpenSession())
using(var tx = session.BeginTransaction()) {
var id1 = Guid.Parse("4e97c816-6bce-11e1-b095-6cf049ee52be");
var id2 = Guid.Parse("AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE");
var customer1 = session.Get<Customer>(id1);
Console.WriteLine("Customer1 data");
Console.WriteLine(customer1);
var customer2 = session.Get<Customer>(id2);
Console.WriteLine("Customer2 data");
Console.WriteLine(customer2);
tx.Commit();
}
Console.WriteLine("Press <ENTER> to exit...");
Console.ReadLine();
}
private static Configuration ConfigureNHibernate() {
NHibernateProfiler.Initialize();
var cfg = new Configuration();
cfg.DataBaseIntegration(x => {
x.ConnectionStringName = "default";
x.Driver<SqlClientDriver>();
x.Dialect<MsSql2008Dialect>();
x.IsolationLevel = IsolationLevel.RepeatableRead;
x.Timeout = 10;
x.BatchSize = 10;
});
cfg.SessionFactory().GenerateStatistics();
cfg.AddAssembly(Assembly.GetExecutingAssembly());
return cfg;
}
}
}
Như bạn có thể thấy rằng chúng tôi có hai GuidID của, cái đầu tiên là một ID tốt, đó là ID của một khách hàng mà chúng tôi biết có trong cơ sở dữ liệu. Trong khi ID thứ hai không có trong cơ sở dữ liệu. Cả hai ID này đều được chuyển dưới dạng tham số choGet() và sau đó kết quả được in trên bàn điều khiển.
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy kết quả sau.
Customer1 data
Laverne Hegmann (4e97c816-6bce-11e1-b095-6cf049ee52be)
Points: 74
HasGoldStatus: True
MemberSince: 4/4/2009 12:00:00 AM (Utc)
CreditRating: Neutral
AverageRating: 0
Orders:
Order Id: 4ea14d96-6bce-11e1-b095-6cf049ee52be
Order Id: 4ea14d96-6bce-11e1-b096-6cf049ee52be
Order Id: 4ea14d96-6bce-11e1-b097-6cf049ee52be
Order Id: 4ea14d96-6bce-11e1-b098-6cf049ee52be
Customer2 data
Press <ENTER> to exit...
Như bạn có thể thấy rằng dữ liệu Customer1 được in nhưng dữ liệu Customer2 trống, đó là vì bản ghi Customer2 không có sẵn trong cơ sở dữ liệu.
Khi bạn chạy lại ứng dụng của mình, chúng tôi có thể chèn một điểm ngắt trước câu lệnh cam kết và sau đó hãy xem xét cả hai khách hàng trong cửa sổ Xem.
Như bạn có thể thấy rằng dữ liệu Customer1 có sẵn, trong khi Customer2 là trống và loại là NHibernateDemo.Customer cho cả hai.
Bây giờ chúng ta hãy sử dụng phương pháp Load thay vì Get trong cùng một ví dụ như trong đoạn mã sau.
using System;
using System.Data;
using System.Linq;
using System.Reflection;
using HibernatingRhinos.Profiler.Appender.NHibernate;
using NHibernate.Cfg;
using NHibernate.Criterion;
using NHibernate.Dialect;
using NHibernate.Driver;
using NHibernate.Linq;
namespace NHibernateDemo {
internal class Program {
private static void Main() {
var cfg = ConfigureNHibernate();
var sessionFactory = cfg.BuildSessionFactory();
using(var session = sessionFactory.OpenSession())
using(var tx = session.BeginTransaction()) {
var id1 = Guid.Parse("4e97c816-6bce-11e1-b095-6cf049ee52be");
var id2 = Guid.Parse("AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE");
var customer1 = session.Load<Customer>(id1);
Console.WriteLine("Customer1 data");
Console.WriteLine(customer1);
var customer2 = session.Load<Customer>(id2);
Console.WriteLine("Customer2 data");
Console.WriteLine(customer2);
tx.Commit();
}
Console.WriteLine("Press <ENTER> to exit...");
Console.ReadLine();
}
private static Configuration ConfigureNHibernate() {
NHibernateProfiler.Initialize();
var cfg = new Configuration();
cfg.DataBaseIntegration(x => {
x.ConnectionStringName = "default";
x.Driver<SqlClientDriver>();
x.Dialect<MsSql2008Dialect>();
x.IsolationLevel = IsolationLevel.RepeatableRead;
x.Timeout = 10;
x.BatchSize = 10;
});
cfg.SessionFactory().GenerateStatistics();
cfg.AddAssembly(Assembly.GetExecutingAssembly());
return cfg;
}
}
}
Bây giờ hãy chạy ví dụ này và bạn sẽ thấy rằng ngoại lệ sau đây được đưa ra như trong ảnh chụp màn hình.
Bây giờ nếu bạn nhìn vào cửa sổ Watch, bạn sẽ thấy loại là khách hàng proxy cho cả hai đối tượng. Và bạn cũng thấy dữ liệu tương tự cho Customer1 trên cửa sổ bảng điều khiển.
Customer1 data
Laverne Hegmann (4e97c816-6bce-11e1-b095-6cf049ee52be)
Points: 74
HasGoldStatus: True
MemberSince: 4/4/2009 12:00:00 AM (Utc)
CreditRating: Neutral
AverageRating: 0
Orders:
Order Id: 4ea14d96-6bce-11e1-b095-6cf049ee52be
Order Id: 4ea14d96-6bce-11e1-b096-6cf049ee52be
Order Id: 4ea14d96-6bce-11e1-b097-6cf049ee52be
Order Id: 4ea14d96-6bce-11e1-b098-6cf049ee52be
Customer2 data