2012-02-02 29 views
7

tôi đang tạo ra một bản đồ lớp con thạo N ngủ đông hiện trông giống như sau:Bạn có thể chỉ định cột nhận dạng khi sử dụng chiến lược Bảng lớp Per-Subclass lưu loát không?

public class TaskDownloadMap: SubclassMap<TaskDownload> 
{ 
    public TaskDownloadMap() 
    { 
     Table("TasksDownload"); 

     Map(x => x.ExtraProperty1, "ExtraProperty1") 
      .Nullable(); 

     Map(x => x.ExtraProperty2, "ExtraProperty2") 
      .Nullable(); 
    } 
} 

Khi tôi cố gắng và lưu một trong những đơn vị tôi nhận được một ngoại lệ:

Test.TaskRepositoryTest.DeleteTest: 
NHibernate.Exceptions.GenericADOException : could not insert: [TaskManager.Entities.TaskDownload#269][SQL: INSERT INTO TasksDownload (ExtraProperty1, ExtraProperty2, Task_id) VALUES (?, ?, ?)] 
    ----> System.Data.SqlClient.SqlException : Invalid column name 'Task_id'. 

Đó là bởi vì Id cột tôi đã đặt trên bảng phân lớp của tôi được đặt tên là "TaskId". Có một số để ghi đè lên lược đồ đặt tên mặc định mà nhibernate đang cố gắng sử dụng không? Tôi dường như không có khả năng xác định cột "Id" trong lớp con và tôi không thể tìm thấy bất kỳ ai khác thậm chí nói về nó.

Việc lập bản đồ mẹ trông như thế này:

public class TaskMap: ClassMap<Task> 
{ 
    public TaskMap() 
    { 
     Table("Tasks"); 

     Id(x => x.Id, "Id") 
      .GeneratedBy.Identity(); 

     . 
     . 
     . 

    } 
} 

Như tôi đã nói trước khi tôi đi với chiến lược Bảng-Per-Subclass vì vậy đây là 2 bảng khác nhau. Tôi có thể thay đổi chìa khóa trên bảng TasksDownload của mình thành "Task_id" nhưng tôi chỉ muốn có thể chỉ định rằng đó là "TaskId" trong ánh xạ của tôi để tôi có thể giữ cho quy ước đặt tên của mình.

+0

thế nào là hệ thống cấp bậc của bạn trông như thế nào? Bạn có thể đăng ánh xạ chính không? – nemesv

+0

Đã chỉnh sửa bài đăng để có ánh xạ chính. –

Trả lời

4

Bạn không thể định cấu hình id của lớp con bằng API thông thạo bởi vì nó được xử lý bởi các phép ánh xạ được xây dựng trong bản đồ. Nhưng bạn có thể viết convention tùy chỉnh (với một số chi tiết acceptance nếu được yêu cầu).
Một giải pháp mẫu:

public class JoinedSubclassIdConvention : IJoinedSubclassConvention, 
    IJoinedSubclassConventionAcceptance 
{ 
    public void Apply(IJoinedSubclassInstance instance) 
    { 
     instance.Key.Column(instance.EntityType.BaseType.Name + "Id"); 
    } 

    public void Accept(IAcceptanceCriteria<IJoinedSubclassInspector> criteria) 
    { 
     criteria.Expect(x => x.EntityType == typeof(TaskDownload)); 
    } 
} 

Sau đó, bạn thêm convetion của bạn để cấu hình:

Fluently.Configure() 
    //... 
    .Mappings(m => 
     { 
      m.FluentMappings 
      //... 
      .Conventions.Add<JoinedSubclassIdConvention>(); 
     }); 
+0

Đã tìm ra giải pháp của bạn và nó hoạt động như một sự quyến rũ. Cảm ơn đã giúp đỡ. –

+0

Câu hỏi thực sự cũ nhưng vẫn có liên quan. Tại sao điều này chỉ có thể cấu hình như một quy ước chứ không phải là một phương thức cho mỗi bản đồ? – shortstuffsushi

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