2012-01-02 43 views
5

Ở Orchard, nhà phát triển mô-đun có thể học cách "tham gia" hoạt động, đặc biệt khi tham gia các phần và bản ghi chính? Một trong những trợ giúp tốt hơn tôi đã thấy là ở Orchard documentation, nhưng không có ví dụ nào trong số những ví dụ này cho thấy cách tạo mối quan hệ với các bộ phận hiện có hoặc lõi. Như một ví dụ về một cái gì đó tôi đang tìm kiếm, đây là một đoạn mã dịch vụ mô-đun lấy từ một ví dụ làm việc:Tìm hiểu các mối quan hệ và mối quan hệ dữ liệu của Orchard

_contentManager 
    .Query<TaxonomyPart>() 
    .Join<RoutePartRecord>() 
    .Where(r => r.Title == name) 
    .List() 

Trong trường hợp này, một phong tục TaxonomyPart được tham gia với một lõi RoutePartRecord. Tôi đã điều tra mã, và tôi không thể thấy làm thế nào mà một TaxononmyPart là "joinable" để một RoutePartRecord. Tương tự như vậy, từ mã làm việc, đây là một mã tài xế đoạn có liên quan một TagsPart tùy chỉnh với một CommonPartRecord lõi:

List<string> tags = new List<string> { "hello", "there" }; 
IContentQuery<TagsPart, TagsPartRecord> query = _cms.Query<TagsPart, TagsPartRecord>(); 
query.Where(tpr => tpr.Tags.Any(t => tags.Contains(t.TagRecord.TagName))); 
IEnumerable<TagsPart> parts = 
    query.Join<CommonPartRecord>() 
    .Where(cpr => cpr.Id != currentItemId) 
    .OrderByDescending(cpr => cpr.PublishedUtc) 
    .Slice(part.MaxItems); 

Tôi nghĩ tôi có thể học hỏi từ một trong các ví dụ trước như thế nào để tạo truy vấn của riêng tôi. Tôi đã làm điều này:

List<string> tags = new List<string> { "hello", "there" }; 
IContentQuery<TagsPart, TagsPartRecord> query = _cms.Query<TagsPart, TagsPartRecord>(); 
query.Where(tpr => tpr.Tags.Any(t => tags.Contains(t.TagRecord.TagName))); 
var stuff = 
    query.Join<ContainerPartRecord>() 
    .Where(ctrPartRecord => ctrPartRecord.ContentItemRecord.ContentType.Name == "Primary") 
    .List(); 

Mục đích của mã của tôi là giới hạn các mục nội dung được tìm thấy chỉ cho một mục cụ thể (hoặc blog). Khi mã chạy, nó đã ném một ngoại lệ trên truy vấn tham gia của tôi nói rằng {"could not resolve property: ContentType of: Orchard.Core.Containers.Models.ContainerPartRecord"}. Điều này dẫn đến nhiều câu hỏi khác nhau:

  1. Tại sao phương pháp Display() của ví dụ thứ hai là CommonPartRecord dân cư, nhưng không phải là ContainerPartRecord? Nói chung làm thế nào tôi biết được phần nào được ghi lại, và khi nào?
  2. Trong đoạn mã hoạt động, tham gia hoạt động chính xác như thế nào vì không có khóa/điều kiện nối nào được chỉ định (và không có khóa tham chiếu ngầm định rõ ràng)? Ví dụ, tôi đã kiểm tra tệp di chuyển dữ liệu và các lớp models và không tìm thấy mối quan hệ vốn có giữa một TagsPart và một CommonPartRecord. Vì vậy, ngoài việc xem xét mã mẫu đó, làm thế nào mà bất cứ ai đã biết ở nơi đầu tiên mà việc tham gia như vậy là hợp pháp hoặc có thể?
  3. Tham gia tôi đã thử với TagsPartContainerPartRecord hợp pháp trong bất kỳ ngữ cảnh nào? Cái nào
  4. Cú pháp truy vấn của các ví dụ này chủ yếu là sự phản ánh của Orchard, NHibernate hoặc LINQ to NHibernate? Nếu nó chủ yếu là một sự phản ánh của NHibernate, sau đó cuốn sách NHibernate hoặc bài viết được khuyến khích đọc để tôi có thể đào sâu hơn vào Orchard?

Có vẻ như có một lỗ trong tài liệu liên quan đến các loại suy nghĩ và câu hỏi này, khiến việc viết mô-đun trở nên khó khăn. Bất kỳ câu trả lời có thể được tìm thấy cho chủ đề này, tôi muốn được vui để biên dịch vào một bài báo hoặc tài liệu hướng dẫn cộng đồng Orchard.

Trả lời

3
  1. Tham gia chỉ ở đó để bật vị trí tiếp theo. Nó không có nghĩa là phần được tham gia sẽ thực sự được đưa xuống từ DB. Điều đó sẽ xảy ra không có vấn đề gì với nguồn 1.x mới nhất, và sẽ xảy ra uể oải với 1.3.
  2. Bạn không cần điều kiện vì bạn chỉ có thể tham gia các phần theo cách này. Điều kiện tham gia là ẩn: các phần được nối với id mục.
  3. Có. Điều gì không hợp pháp là điều kiện ở nơi đang sử dụng dữ liệu không có sẵn từ các bản ghi phần tham gia.
  4. Các ví dụ này là tất cả các truy vấn của Trình quản lý nội dung Orchard, vì vậy chúng khá hạn chế, nhưng cũng khá dễ dàng để xây dựng miễn là bạn không bước ra ngoài ranh giới của chúng bởi vì quá nhiều có thể được giả định và sẽ xảy ra ngầm.Nếu bạn cần kiểm soát nhiều hơn, bạn có thể sử dụng các khả năng HQL mới đã được thêm vào trong các lần giảm 1.x mới nhất.

Đối với lỗ hổng trong tài liệu, tốt, nhưng tất nhiên. Các tài liệu mà chúng tôi có ngày hôm nay chỉ bao gồm một phần rất nhỏ của nền tảng này. Tài liệu tham khảo tốt nhất của bạn hôm nay là mã nguồn. Bất kỳ đóng góp nào bạn có thể làm cho điều này được chúng tôi đánh giá cao và bởi phần còn lại của cộng đồng. Hãy cho tôi biết nếu bạn cần trợ giúp về điều này.

+1

Câu trả lời của bạn là một trợ giúp HUGE. Tôi nghĩ rằng bước tiếp theo, để chuẩn bị cho tài liệu mới, là để xây dựng trên câu trả lời # 2. Hiện tại, tôi nghĩ một cuộc đối thoại sẽ tốt hơn diễn đàn Hỏi & đáp. Chúng ta có thể có một cuộc thảo luận e-mail không? [email protected] –

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