2009-07-20 30 views
23

Tôi có một lớp học trong rễ mô hình tên miền của tôi trông như thế này:NHibernate DuplicateMappingException khi hai lớp có cùng tên nhưng không gian tên khác nhau

namespace Domain 
{ 
    public class Foo { ... } 
} 

Tôi cũng có một lớp có cùng tên trong một không gian tên khác nhau:

namespace Domain.SubDomain 
{ 
    public class Foo { ... } 
} 

đối với các ánh xạ của tôi, tôi có một thư mục Mapping với một thư mục con gọi là SubDomain có chứa ánh xạ cho các lớp miền tìm thấy trong Domain.SubDomain namespace. Họ là tất cả trong cùng một hội đồng.

Tuy nhiên, khi tôi cố gắng tải chúng với NHibernate, tôi tiếp tục nhận được một DuplicateMappingException ... mặc dù cả hai Foos có không gian tên khác nhau. Mã Tôi đang sử dụng để tải cấu hình NHibernate của tôi là thế này:

var cfg = new Configuration() 
    .Configure()     
    .AddAssembly("Domain"); 

Làm thế nào tôi có thể nói NHibernate để cho tôi sử dụng hai thực thể có cùng tên (nhưng không gian tên khác nhau)?

+0

Trong trường hợp nó giúp mọi người: cùng một câu hỏi cho Fluent.nHibernate: https://stackoverflow.com/questions/1290466/ – Malcolm

Trả lời

22

Tôi tìm thấy answer trên website Hibernate:

Nếu bạn có hai lớp dai dẳng với tên không đủ tiêu chuẩn tương tự, bạn nên thiết lập tính năng tự động nhập khẩu = "false". Một trường hợp ngoại lệ sẽ xảy ra nếu bạn cố gắng để chỉ định hai lớp học cho cùng một tên "đã nhập".

Tôi đã sử dụng nó làm thuộc tính cho thẻ <hibernate-mapping> và thẻ hoạt động.

+0

Có ai biết làm thế nào để làm điều này khi sử dụng ** NHibernate.Mapping.Attributes ** để ánh xạ? –

3

Bạn có thể chỉ định một lớp tên đầy đủ trong tài liệu bản đồ như vậy:

<class name="SeeMe.Data.People.Relationship, SeeMe.Data" ... > ... 

đâu SeeMe.Data là lắp ráp.

+1

Vẫn nói: 'NHibernate.DuplicateMappingException: nhập trùng lặp: Foo đề cập đến cả Domain.SubDomain.Foo, Tên miền, Phiên bản = 1.0.0.0, Văn hóa = trung lập, PublicKeyToken = null và Domain.Foo, Tên miền, Phiên bản = 1.0.0.0, Văn hóa = trung lập, PublicKeyToken = null (thử sử dụng tự động nhập = "sai") ' – cdmckay

+1

Chết tiệt, ngay sau khi tôi sao chép và dán vào đó tôi thấy đề xuất 'auto-import =" false "' ... và nó đã hoạt động. – cdmckay

+1

hehe saight, nHibernate rock nhưng tôi cảm thấy nó không trực quan lắm. Tôi đã dành rất nhiều thời gian đập đầu của tôi trên một số vấn đề lập bản đồ ngớ ngẩn. –

16

Tôi đã gặp sự cố tương tự. Tôi đã giải quyết nó như sau:

Fluently.Configure() 
      .Database(MsSqlConfiguration.MsSql2008 
       .ConnectionString(...) 
       .AdoNetBatchSize(500)) 
      .Mappings(m => m.FluentMappings 
       .Conventions.Setup(x => x.Add(AutoImport.Never())) 
       .AddFromAssembly(...) 
       .AddFromAssembly(...) 
       .AddFromAssembly(...) 
       .AddFromAssembly(...)) 
      ; 

Phần được nhập là: .Conventions.Setup(x => x.Add(AutoImport.Never())). Mọi thứ có vẻ hoạt động tốt với cấu hình này.

+1

Bạn có thể vui lòng thêm giải thích về tên bảng được sử dụng với thiết lập này không. Cảm ơn. –

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