2012-01-22 28 views
6

Mô hình khung thực thể của tôi được tạo ra từ cơ sở dữ liệu SQL Server. Vì tôi cần truy cập cơ sở dữ liệu từ Silverlight, tôi đã tạo một DomainService cho RIAServices dựa vào mô hình EF. Product là một trong số EntityObject được tạo tự động tương ứng với bảng Product. Tôi đang cố chuyển lớp tùy chỉnh CompositeData cho ứng dụng Silverlight như được hiển thị. Vấn đề là trường CurrentProduct không thể truy cập được trong ứng dụng khách nhưng các trường chuỗi/int khác có thể truy cập được. Làm cách nào để có thể truy cập CurrentProduct từ ứng dụng khách?Không thể truy cập loại EntityObject thông qua các dịch vụ RIA

public class CompositeData 
{ 
    [Key] 
    public Guid PKey { get; set; } 
    public string CompositeName { get; set; } 
    public string Identity { get; set; } 
    public Product CurrentProduct { get; set; } //Product is an auto-generated EntityObject class 

    public CompositeData() 
    { 
     PKey = Guid.NewGuid(); 
    } 
} 

Tiếp theo là phương pháp Dịch vụ tên miền:

[EnableClientAccess()] 
public class LocalDomainService : DomainService 
{ 
    public IEnumerable<CompositeData> GetData() 
    { 
     List<CompositeData> listData = new List<CompositeData>(); 
     //... 
     return listData; 
    } 
} 

Từ client Silverlight,

domService.Load(domService.GetDataQuery(), GetDataCompleted, null); 

    private void GetDataCompleted(LoadOperation<CompositeData> compData) 
    { 
     foreach(CompositeData cdItem in compData.Entities) 
     { 
      // cdItem.CompositeName is accessible 
      // cdItem.CurrentProduct is not accessible! 
     }      
    } 

EDIT: Product lớp là autogenerated trong Model1.Designer.cs

[EdmEntityTypeAttribute(NamespaceName="MyDBModel", Name="Product")] 
    [Serializable()] 
    [DataContractAttribute(IsReference=true)] 
    public partial class Product : EntityObject 
    { 
     //.. 
    } 

Nó được tạo ra trong dự án của khách hàng cũng (trong SilverlightProject.g.cs)

/// <summary> 
    /// The 'Product' entity class. 
    /// </summary> 
    [DataContract(Namespace="http://schemas.datacontract.org/2004/07/SilverlightProject")] 
    public sealed partial class Product : Entity 
    { 
     //.. 
    } 
+0

Bạn Silverlight có tham chiếu đến một assembly, trong đó loại sản phẩm được định nghĩa? –

+0

Vui lòng xem câu hỏi đã chỉnh sửa – Nemo

Trả lời

1

Bạn có thể xác định một mối quan hệ giữa CompositeDataProduct sử dụng IncludeAssociation thuộc tính.

[System.ServiceModel.DomainServices.Server.Include] 
[System.ComponentModel.DataAnnotations.Association("AssociationName", "MainKey", "AssociatedObjectKey")] 
public Product CurrentProduct { get; set; } 
0

(xin lỗi vì tiếng xấu của tôi)

Bạn cần phải vạch trần tổ chức Product bạn trong lớp DomainService quá là có thể nhìn thấy nó ở phía bên bạc:

public IEnumerable<Product> GetProduct() 
{ 
    //... 
    return listProduct; 
} 
+0

Làm cách nào để hiển thị? Đã có thể truy cập trong lớp Dịch vụ miền. – Nemo

+0

Bạn chỉ cần đặt phương thức ở đó trả về loại 'Product' hoặc' IQueryable 'hoặc 'IEnumerable ' (giống như bạn đã làm với lớp 'CompositeData') - Không có vấn đề này, vấn đề bạn có chính xác là những gì xảy ra ... nhưng nếu nó đã có, tôi không thể tưởng tượng những gì có thể xảy ra :( – Leo

0

Đây là những gì tôi làm để nhanh chóng thêm bảng vào dự án Silverlight RIA của tôi. này giả định tôi đã có một ADO.NET Entity Data Model hiện có, DomainService.cs, và DomainService.metadata.cs

  1. tôi cập nhật mô hình dữ liệu của tôi
  2. dự án xây dựng
  3. thêm một thương hiệu dịch vụ tên miền mới lớp và tên là một cái gì đó khác với cái bạn có.
  4. chỉ thêm bảng mới vào Dịch vụ miền mới của bạn khi nó yêu cầu. này sẽ tạo cả tên miền mớierviceervice.cs và domainservice.metadata.cs với thông tin cho bảng mới của bạn.
  5. sao chép mã được tạo tự động từ dịch vụ tên miền mới và đặt nó trong dịch vụ miền hiện tại của bạn và xóa dịch vụ bạn vừa tạo.
  6. làm tương tự cho siêu dữ liệu.
  7. xây dựng dự án và sau đó thực hiện xong.
0

Có thể xác định ExternalReferenceAttribute và thuộc tính AssociationAttribute trên sản phẩm hiện tại của bạn.

[System.ServiceModel.DomainServices.ExternalReference] 
[System.ComponentModel.DataAnnotations.Association("AssociationName", "MainKey", "AssociatedObjectKey")] 
public Product CurrentProduct { get; set; } 

Chỉ cần thay thế thuộc tính Bao gồm với thuộc tính ExternalReference.

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