Риа Услуги и вопросы собственности навигации - PullRequest
2 голосов
/ 21 июля 2011

У меня проблема с использованием Silverlight4, Ria Services и Entity Framework.

Из моего клиента sl я пытаюсь получить некоторые данные через службы ria, в моем классе domainService этот метод вызывается:

public IQueryable<LastMinuteWachtLijstPromotie> GetLastMinuteWachtLijstPromoties(){
  IQueryable<LastMinuteWachtLijstPromotie> list = (IQueryable<LastMinuteWachtLijstPromotie>)this.ObjectContext.LastMinuteWachtLijstPromoties.Include("Promotie");

  return (from LastMinuteWachtLijstPromotie lwmp in list where lwmp.Actief select lwmp);
}

когда я проверяю содержимое списка, в режиме отладки он заполняется объектами типа LastMinuteWachtLijstPromotie. эти объекты имеют свойство навигации к объекту с именем Promotie. И я могу получить доступ к свойствам этих объектов Promotie.

На клиенте silveright, однако, метод вызывается после завершения загрузки:

public void OnLoadEntitiesCompleted(ServiceLoadResult<T> result) {

}

В этом методе я получаю все запрошенные объекты LastMinuteWachtLijstPromotie, как и ожидалось, свойство Однако Promotie не имеет значения.

Я установил тег [Включить] для свойства Promotie в автоматически сгенерированном классе метаданных. и я использую .Include ("Promotie")

Эти же методы используются для разных объектов из моей доменной модели, это прекрасно работает. Кроме того, я не могу найти различия в файле .edmx с отображениями базы данных и свойствами навигации.

Кто-нибудь сталкивался с такой же проблемой или знает решение для нее?

классы метаданных:

[MetadataTypeAttribute(typeof(LastMinuteWachtLijstPromotie.LastMinuteWachtLijstPromotieMetadata))]
        public partial class LastMinuteWachtLijstPromotie
        {

            // This class allows you to attach custom attributes to properties
            // of the LastMinuteWachtLijstPromotie class.
            //
            // For example, the following marks the Xyz property as a
            // required property and specifies the format for valid values:
            //    [Required]
            //    [RegularExpression("[A-Z][A-Za-z0-9]*")]
            //    [StringLength(32)]
            //    public string Xyz { get; set; }
            internal sealed class LastMinuteWachtLijstPromotieMetadata
            {

                // Metadata classes are not meant to be instantiated.
                private LastMinuteWachtLijstPromotieMetadata()
                {
                }

                public int AlertId { get; set; }

                public string ArtikelNummer { get; set; }

                public Nullable<int> ArtikelVariant { get; set; }

                public int LastMinuteWachtLijstPromotieId { get; set; }

                [Include]
                public Promotie Promotie { get; set; }

                public int PromotieArtikelId { get; set; }

                public int PromotieId { get; set; }

                public bool Actief { get; set; }

                public DateTime Aanmaakdatum { get; set; }
            }
        }


        [MetadataTypeAttribute(typeof(Promotie.PromotieMetadata))]
    public partial class Promotie
    {

        // This class allows you to attach custom attributes to properties
        // of the Promotie class.
        //
        // For example, the following marks the Xyz property as a
        // required property and specifies the format for valid values:
        //    [Required]
        //    [RegularExpression("[A-Z][A-Za-z0-9]*")]
        //    [StringLength(32)]
        //    public string Xyz { get; set; }
        internal sealed class PromotieMetadata
        {

            // Metadata classes are not meant to be instantiated.
            private PromotieMetadata()
            {
            }

            public string ActieType { get; set; }

            public string AssortimentsManagerNaam { get; set; }

            public string AssortimentsManagerTeamIds { get; set; }

            [Display(Name = "Commerciele tekst")]
            [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Nokavision.ReclameFolder.UI.Web.Resources.ValidationResources))]            
            public string CommercieleTekst { get; set; }

            [Display(Name = " ")]
            public string CommercieleTekstDetails { get; set; }

            [Include]
            public Frame Frame { get; set; }

            public Nullable<int> FrameId { get; set; }

            public Nullable<DateTime> LastMinuteWijzigingsDatum { get; set; }

            public string Opmerkingen { get; set; }

            [Display(Name = "Op wachtlijst")]
            public Nullable<bool> OpWachtLijst { get; set; }

            //public Nullable<int> PromotieCopyId { get; set; }

            public int PromotieId { get; set; }

            [Include]
            public EntityCollection<PromotieLeverancier> PromotieLeveranciers { get; set; }

            [Include]
            public EntityCollection<PromotieMutatie> PromotieMutaties{ get; set; }

            //public Nullable<int> PromotieOrigineleId { get; set; }

            [Include]
            public EntityCollection<PromotieSymbool> PromotieSymbolen { get; set; }

            public string Status { get; set; }

            [Display(Name = "Promotie inhoud")]
            public string PromotieInhoud { get; set; }

            [Display(Name = "Promotie eenheid")]
            public string PromotieEenheid { get; set; }

            [Display(Name = "Promotie prijs")]
            public decimal PromotiePrijs { get; set; }
        }
    }

Ответы [ 3 ]

1 голос
/ 28 мая 2012

Я знаю, что это старая ветка, и на нее, возможно, уже ответили, но я просто наткнулся на нее, и так как никто не предоставил ссылку или лучший ответ.

В настоящее время я использую Silverlight 5, и это то, что у меня сработало (я думаю, что процесс в SL4 IIRC такой же).

При распространении свойств навигации на клиент, вам необходимо сообщить службам RIA, что где-то существует связь, использующая атрибуты [Key] и [Association], что, в отличие от структуры сущностей, просто описывает, как сопоставить связь с надлежащими объект.

Первые классы метаданных:

[MetadataTypeAttribute(typeof(Category.CategoryMetadata))]
public partial class Category
{
    internal sealed class CategoryMetadata
    {
        private CategoryMetadata() {
        }

        [Key]
        public int Id { get; set; }

        public string NAME { get; set; }

        [Association("CategoryToProducts", "Id", "CAT")]
        [Include]
        public EntityCollection<Product> Products { get; set; }
    }
}

[MetadataTypeAttribute(typeof(Order.OrderMetadata))]
public partial class Order
{

    internal sealed class OrderMetadata
    {

        // Metadata classes are not meant to be instantiated.
        private OrderMetadata() {
        }

        [Key]
        public int Id { get; set; }

        public int PRODID { get; set; }

        public DateTime DATE { get; set; }

        public bool DONE { get; set; }

        public int QTY { get; set; }

        [Association("OrderToProduct", "PRODID", "Id", IsForeignKey = true)]
        [Include]
        public Product Product { get; set; }
    }
}

[MetadataTypeAttribute(typeof(Product.ProductMetadata))]
public partial class Product
{
    internal sealed class ProductMetadata
    {
        private ProductMetadata() {
        }

        [Key]
        public int Id { get; set; }

        public int CAT { get; set; }

        public string NAME { get; set; }

        public string DESC { get; set; }

        public decimal PRICE { get; set; }

        public int QTY { get; set; }

        public long UPC { get; set; }

        [Association("ProdToCat", "CAT", "Id", IsForeignKey = true)]
        [Include]
        public Category Category { get; set; }

        [Association("ProductToOrders", "Id", "PRODID")]
        [Include]
        public EntityCollection<Order> Orders { get; set; }
    }
}

Теперь нам нужно сообщить службам RIA, что мы хотим, чтобы она загрузила ассоциацию: (Примечание: Intellisense говорит, что это список имен свойств, разделенных точками, однако я попытался что-то вроде .Include ("Category.SubCategory"), и это не удалось с исключением ... Хотя .Include ("Категория"). Include ( «Подкатегория») работала как шарм!)

public IQueryable<Product> GetProducts() {
    return this.ObjectContext.Products.Include("Category");
}

Теперь я могу получить доступ к своему свойству "Category" из клиента Silverlight, и оно не равно NULL:)

1 голос
/ 05 июля 2012

То же, что и SilverX: только что возникла проблема, решил ее и подумал, что она может быть кому-то полезна.

У меня тоже все параметры конфигурации были правильными ([Include] для RIA S, Include() для EF), но свойство навигации было все еще нулевым на стороне Silverlight.

Оказывается, что метод доменной службы использовал атрибут [Invoke] (и возвращал IEnumerable<T>).Удаление этого атрибута решило проблему.

(только для записи, [Invoke] использовался, потому что метод имел параметр List<Entity>)

1 голос
/ 21 июля 2011

Добавьте атрибут Composition к свойству Promotie свойства LastMinuteWachtLijstPromotieMetadata. Тогда это должно работать.

public partial class LastMinuteWachtLijstPromotie {
  internal sealed class LastMinuteWachtLijstPromotieMetadata{
    [Include]
    [Composition]
    public Promotie Promotie { get; set; }
  }
}
...