2010-04-16 31 views
9

Dự án của tôi cần xử lý ba cơ sở dữ liệu, có nghĩa là ba nhà máy phiên. Vấn đề là nếu tôi làm điều gì đó như thế này với nhibernate thạo:Lưu loát NHibernate + nhiều cơ sở dữ liệu

.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())) 

các nhà máy sẽ nhận tất cả các ánh xạ, ngay cả những người mà tương ứng với cơ sở dữ liệu khác

I have seen that khi sử dụng automapping bạn có thể làm điều gì đó như thế này và lọc theo không gian tên:

.Mappings(m => m.AutoMappings.Add(
    AutoMap 
     .AssemblyOf<Product>() 
     .Where(t => t.Namespace == "Storefront.Entities"))) 

Tôi không tìm thấy bất cứ điều gì như thế này cho ánh xạ trôi chảy, có thể không ?? Các giải pháp duy nhất tôi có thể nghĩ đến là: hoặc tạo các assembly riêng biệt cho mỗi lớp ánh xạ db hoặc thêm một cách rõ ràng từng thực thể vào cấu hình của nhà máy.

Tôi muốn tránh cả hai, nếu có thể. Cảm ơn.

+2

Tôi muốn tư vấn cho một bản đồ lắp ráp cho mỗi cơ sở dữ liệu trong trường hợp này. Đó là một sự phân tách tốt các mối quan tâm và phải dễ dàng cho bất kỳ nhà phát triển nào khác hiểu được. –

+0

Có vẻ như tôi cần phải đặt tất cả các lớp học trong một dự án khác và dự án khác cho db thứ hai. – CallMeLaNN

Trả lời

5

Tôi đã thực hiện chính xác này sử dụng thuộc tính (của riêng tôi) vào file mapping thạo để sai khiến mà DB thực thể thuộc về. Tôi cũng đã có một khái niệm về cơ sở dữ liệu 'mặc định' và các tệp ánh xạ không có thuộc tính được giả định nằm trong DB mặc định (nó có thể giảm số lượng lớp bạn cần để trang trí). Sau đó, tôi có mã khởi tạo tạo một Nhà máy phiên trên mỗi cơ sở dữ liệu và cho mỗi lớp sử dụng sự phản chiếu để tìm tất cả các lớp ClassMap, kiểm tra thuộc tính để xác định DB nào thuộc về và đăng ký từng ClassMap tương ứng.

Một ví dụ tập tin bản đồ:

[FluentNHibernateDatabase("MySecurityDatabase")] 
    public class SystemUserMap : ClassMap<SystemUser> 
    { 
    public SystemUserMap() 
    { 
     Id(x => x.SystemUserId); 
     Map(x => x.LoginId); 
     Map(x => x.LoginPassword); 
     Map(x => x.UserFirstName); 
     Map(x => x.UserSurname); 
     References(x => x.UserOrganisation, "OrganisationId"); 
    } 
    } 

Rõ ràng là tôi đã xác định một danh sách các DBS được tham chiếu/sử dụng.
thực hiện tôi làm việc cho đến nay như tôi đã lấy nó, nhưng tôi đã trúng một snag (mà tôi hy vọng ai đó có thể giúp đỡ với):

Tôi đã hỏi câu hỏi của tôi ở đây: How to identify a particular entity's Session Factory with Fluent NHibernate and Multiple Databases

+3

Trong trường hợp này, bạn đang sử dụng thuộc tính ở đâu? Tôi biết nó sẽ có trong cấu hình lập bản đồ, nhưng bất kỳ cơ hội nào bạn có thể cung cấp thêm chi tiết về việc triển khai của bạn? Cảm ơn! – reallyJim

+0

Thuộc tính FluentNHibernateDatabase và cách bạn định nghĩa Fluently.Configure()? – CallMeLaNN

+0

Thuộc tính là của riêng tôi và tôi sử dụng nó để xác định DB mà một lớp cụ thể phải được đăng ký (tham số cho thuộc tính là tên tôi đã cung cấp cho DB của tôi). Tôi đã thực hiện như vậy mà tôi có những gì tôi xem xét 'mặc định' DB, và tất cả các tập tin bản đồ liên quan đến các thực thể trong DB đó không cần thuộc tính (hoặc, nghịch đảo: Tất cả các tập tin bản đồ mà không có thuộc tính được giả định là nhằm DB mặc định). – Trevor

1

Bạn cũng có thể lọc theo loại. Đây là một dòng mã nhận xét từ một trường "AutoPersistenceModel" màu xanh lá cây mà tôi sử dụng trong cùng một assembly như một "trường màu nâu" (tức là hai cơ sở dữ liệu). Nhưng chỉ có một loại tôi cần phải lọc, vì vậy tôi đã không bận tâm để tách ra một hội đồng di sản. Nếu bạn đã có rất nhiều người trong số họ mỗi db sau đó tách chúng bằng cách hội đồng có lẽ sẽ là IMO tốt nhất.

Sẽ thật tuyệt nếu FNH có thể cung cấp một số loại hỗ trợ multi-db được xây dựng nhưng tôi không biết điều đó thực sự có thể được thực hiện như thế nào; một số loại từ điển của SessionFactories có thể nhưng mọi tình huống chỉ là duy nhất.

HTH,
Berryl

/// <summary> 
    /// This would simply call <see cref="AutoMapHelpers.GetAutoMappingFilter"/> but we need to 
    /// exclude <see cref="LegacyProject"/> also for now. 
    /// </summary> 
    private static bool _getIncludedTypesFilter(Type t) { 
     return _isNotLegacy(t) && AutoMapHelpers.GetAutoMappingFilter(t); 
    } 
    private static bool _isNotLegacy(Type t) { return !t.Equals(typeof(LegacyProject)); } 
4

cách dễ dàng để làm điều này là để đặt tên cơ sở dữ liệu vào Schema

Sau đó, với điều kiện tất cả các bảng có thể truy cập vào các chuỗi kết nối tương tự, bạn chỉ cần một máy phiên

0

Mặc dù nó là rất chậm phản ứng, tôi đề nghị bạn đi qua url sau đó infact có một số giải pháp để được giải quyết và do đó bạn có thể tìm thấy giải pháp trong câu trả lời tuy nhiên. Here là giải pháp cho câu trả lời của bạn được thực hiện với sự giúp đỡ của url

Bằng các giải pháp thực hiện bởi tôi bạn chỉ có thể thực hiện cơ sở dữ liệu mô hình đầu tiên như bây giờ. Hãy thử Tránh phương thức GenerateSchema trong Câu hỏi được đăng bởi tôi tại url được đề cập, vì nó vẫn chưa được triển khai như khi bạn sử dụng phương thức đó, bạn sẽ thấy nhiều cơ sở dữ liệu với cùng một bảng và các mối quan hệ được tạo.

Các vấn đề liên quan