Не удается получить доступ к типу EntityObject через службы RIA - PullRequest
6 голосов
/ 22 января 2012

Моя модель Entity Framework генерируется из базы данных SQL Server.Так как мне нужен доступ к базе данных из Silverlight, я сгенерировал DomainService для RIAServices на основе модели EF.Product является одним из автоматически сгенерированных EntityObject, соответствующих таблице Product.Я пытаюсь передать пользовательский класс CompositeData клиенту Silverlight, как показано на рисунке.Проблема в том, что поле CurrentProduct недоступно на клиенте, но доступны другие поля string / int.Как сделать CurrentProduct доступным из клиента?

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();
    }
}

Ниже приводится метод доменной службы:

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

Из клиента 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!
        }                     
    }

РЕДАКТИРОВАТЬ: Product класс автоматически генерируется в Model1.Designer.cs

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

Он также генерируется в клиентском проекте (в SilverlightProject.g.cs)

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

Ответы [ 4 ]

1 голос
/ 09 февраля 2012

Вы можете определить отношение между CompositeData и Product, используя атрибуты Include и Association.

[System.ServiceModel.DomainServices.Server.Include]
[System.ComponentModel.DataAnnotations.Association("AssociationName", "MainKey", "AssociatedObjectKey")]
public Product CurrentProduct { get; set; }
0 голосов
/ 13 февраля 2012

Это возможно путем определения атрибутов ExternalReferenceAttribute и AssociationAttribute. над вашей собственностью CurrentProduct.

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

Просто замените атрибут включения атрибутом ExternalReference.

0 голосов
/ 31 января 2012

Вот что я делаю, чтобы быстро добавить таблицы в мой проект RIA Silverlight.это предполагает, что у меня уже есть существующая модель данных сущностей ADO.NET, DomainService.cs и DomainService.metadata.cs

  1. Я обновляю свою модель данных
  2. Проект сборки
  3. добавьте новый класс доменной службы и имя будет отличаться от того, которое у вас есть.
  4. добавьте только новую таблицу в новую службу домена, когда она запросит.это должно сгенерировать как новый domainservice.cs, так и domainservice.metadata.cs с информацией для вашей новой таблицы.
  5. скопируйте автоматически сгенерированный код из новой службы домена, поместите его в существующую службу домена и удалите только что созданный вами.
  6. сделать то же самое для метаданных.
  7. создайте проект, а затем закончите.
0 голосов
/ 23 января 2012

(извините за мой плохой английский)

Вам необходимо также выставить свою сущность Product в классе DomainService, чтобы иметь возможность видеть ее на стороне Silverlight:

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