Ria服务和导航属性问题

本文关键字:属性 问题 导航 服务 Ria | 更新日期: 2023-09-27 18:03:03

我在使用Silverlight4、Ria服务和实体框架时遇到了一个问题。

从我的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对象的属性。

在silverlight客户端上,当加载完成时调用一个方法:

public void OnLoadEntitiesCompleted(ServiceLoadResult<T> result) {
}

在这个方法中,我得到所有请求的LastMinuteWachtLijstPromotie对象,如预期的属性Promotie为空。

我在自动生成的元数据类中的Promotie属性上设置了[Include]标签我使用。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; }
        }
    }

Ria服务和导航属性问题

将Composition属性添加到LastMinuteWachtLijstPromotieMetadata类的Promotie属性。那么它应该可以工作。

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

我知道这是一个较旧的线程,它可能已经在其他地方得到了回答,但我只是偶然发现了它,因为没有人提供链接或更好的答案。

我目前正在使用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服务我们希望它加载关联:(注:智能感知说,这是一个点分隔列表的属性名称包括,但我尝试了一些像。include("类别。子类"),这失败了一个例外…尽管.Include("Category").Include("SubCategory")很管用

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

我现在可以从Silverlight客户端访问我的"Category"属性,它不是NULL:)

与SilverX相同:只是遇到了问题,解决了它,并认为它可能对某人有用。

我也有所有的配置正确的东西([Include]为RIA S, Include()为EF),但导航属性仍然是空的Silverlight侧。

显示域服务方法正在使用[Invoke]属性(并返回IEnumerable<T>)。删除此属性解决了问题。

(只是为了记录,[Invoke]被使用,因为方法有一个List<Entity>参数)