2010-03-12 16 views
5

Khi ánh xạ một HasMany hoặc HasManyToMany trong nhibernate thông thạo, bạn có thể chỉ định tên cột để sử dụng cho danh sách như một tham số cho phương thức AsList() như sau:Có thể chỉ định tên của thuộc tính Chỉ mục để sử dụng cho các danh sách trong quy ước nhibernate thông thạo không?

HasMany(c => c.Customers) 
    .AsList(c => c.Column("PositionIndex")); 

Tôi muốn để có thể thiết lập điều này bằng cách sử dụng một công ước thông thạo NHibernate (hoặc là một hiện có trước, hoặc một tùy chỉnh), đặc biệt là vì tên mặc định xuất hiện là "Index" là một từ dành riêng trong MSSQL.

Tôi đã thử sử dụng quy ước tùy chỉnh triển khai IHasManyConvention, nhưng thông số cá thể dường như không chứa thông tin về danh sách, túi hoặc tập hợp của nó và cũng không chứa chi tiết cột cho chỉ mục cột.

public void Apply(IOneToManyCollectionInstance instance) 
{ 

} 

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

Trả lời

1

Khi quy ước đang được áp dụng, ánh xạ cơ bản đã được tạo. Hiện tại không có cách nào để thay đổi ánh xạ này thành một bộ sưu tập được sắp xếp (hoặc bất kỳ loại nào khác) thông qua quy ước.

Tuy nhiên, bạn vẫn có thể thay đổi loại bộ sưu tập thông qua một IAutoMappingOverride <> vì chúng được áp dụng trước các quy ước.

Ngay cả khi điều này chưa được hỗ trợ, có vẻ như khá cao trong danh sách Todo cho bản phát hành tiếp theo. Xem chi tiết thread để biết thêm chi tiết.

+0

Cảm ơn bạn trả lời, tuy nhiên các cuộc đàm phán chủ đề về việc sử dụng Công ước để xác định rằng IList nên được ánh xạ như một danh sách thay vì của một cái túi. Trừ khi tôi đang thiếu một cái gì đó, nó không đề cập đến bất cứ điều gì về việc chỉ định một quy ước cho tên cột của cột chỉ mục – Teevus

+0

@Teevus: Tôi chưa đủ rõ ràng. Xin lỗi vì chuyện đó. Tôi đã cập nhật câu trả lời cho phù hợp. – nulltoken

1

chỉ trong trường hợp ai đó đến đây

vì FNH 1.2 có thể thay đổi túi thành danh sách trong quy ước. Với mà tôi thực hiện:

class CollectionsAreListsConvention : ICollectionConvention 
{ 
    public void Apply(ICollectionInstance instance) 
    { 
     instance.AsList(); 
     instance.Key.Column(instance.EntityType.Name + "_id"); 

     var mapping = (CollectionMapping)instance.GetType() 
      .GetField("mapping", BindingFlags.Instance | BindingFlags.NonPublic) 
      .GetValue(instance); 

     if (!mapping.HasValue(m => m.Index)) 
     { 
      var indexmapping = new IndexMapping(); 

      indexmapping.AddColumn(new ColumnMapping 
      { 
       // for Classes with more than one collection to another Class 
       Name = instance.Member.Name + "_position", 
      }); 

      mapping.Index = indexmapping; 
     } 
    } 
} 

Không hoàn hảo nhưng cũng đủ cho dự án của tôi với tấn các danh sách

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