5

Tôi có một lớp trừu tượng, và lớp con của điều này, và tôi muốn ánh xạ điều này đến cơ sở dữ liệu của tôi bằng cách sử dụng NHibernate. Tôi đang sử dụng Fluent và read on the wiki cách thực hiện ánh xạ. Nhưng khi tôi thêm ánh xạ của lớp con một NHibernate.DuplicateMappingException được ném khi nó được ánh xạ. Tại sao?NHibernate DuplicateMappingException khi ánh xạ lớp trừu tượng và lớp con

Dưới đây là của tôi (đơn giản hóa) lớp:

public abstract class FieldValue 
{ 
    public int Id { get; set; } 
    public abstract object Value { get; set; } 
} 

public class StringFieldValue : FieldValue 
{   
    public string ValueAsString { get; set; } 
    public override object Value 
    { 
     get 
     { 
      return ValueAsString; 
     } 
     set 
     { 
      ValueAsString = (string)value; 
     } 
    } 
} 

Và ánh xạ:

public class FieldValueMapping : ClassMap<FieldValue> 
{ 
    public FieldValueMapping() 
    { 
     Id(m => m.Id).GeneratedBy.HiLo("1"); 
     // DiscriminateSubClassesOnColumn("type"); 
    } 
} 

public class StringValueMapping : SubclassMap<StringFieldValue> 
{ 
    public StringValueMapping() 
    { 
     Map(m => m.ValueAsString).Length(100); 
    } 
} 

Và ngoại trừ:

NHibernate.MappingException: Không thể biên dịch các tài liệu bản đồ : (XmlDocument) ----> NHibernate.DuplicateMappingException: Lớp trùng lặp/ánh xạ thực thể Na mespacePath.StringFieldValue

Bất kỳ ý tưởng nào?

Trả lời

7

Đã phát hiện sự cố. Nó bật ra rằng tôi đã tham khảo cùng một hội đồng nhiều lần trong PersistenceModel được sử dụng để cấu hình cơ sở dữ liệu:

public class MappingsPersistenceModel : PersistenceModel 
{ 
    public MappingsPersistenceModel() 
    { 
     AddMappingsFromAssembly(typeof(FooMapping).Assembly); 
     AddMappingsFromAssembly(typeof(BarMapping).Assembly); 
     // Where FooMapping and BarMapping is in the same Assembly. 
    } 
} 

Rõ ràng đây không phải là vấn đề đối với ánh xạ ClassMap. Nhưng đối với SubclassMap nó cũng không xử lý nó, gây ra ánh xạ trùng lặp - và do đó là DuplicateMappingException. Loại bỏ các bản sao trong PersistenceModel sẽ khắc phục sự cố.

2

Nếu bạn đang sử dụng automappings cùng với ánh xạ rõ ràng thì thông thạo có thể tạo hai ánh xạ cho cùng một lớp.

+0

Vâng - Tôi chỉ sử dụng ánh xạ rõ ràng, nhưng suy nghĩ vượt qua tâm trí của tôi .. Tôi phải có một cái nhìn để xem nếu nó vì một lý do nào đó tự động ánh xạ lớp con. Phải không? – stiank81

+0

Đây là lần đầu tiên tôi sử dụng SubclassMap. ClassMap không được tự động hóa, nhưng có thể là SubclassMaps được không? Tôi không có nhiều kinh nghiệm với Thông thạo .. – stiank81

+0

http://stackoverflow.com/questions/1538248/fluent-nhibernate-mapping-a-class-with-subclass-problem/1538419#1538419 bạn có thể xem tại đây ví dụ – Sly

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