Ria 服务和导航属性问题

发布于 2024-11-25 09:53:34 字数 5103 浏览 1 评论 0原文

我在使用 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 对象的属性。

然而,在 silveright 客户端上,加载完成时会调用一个方法:

public void OnLoadEntitiesCompleted(ServiceLoadResult<T> result) {

}

在该方法中,我按预期获取所有请求的 LastMinuteWachtLijstPromotie 对象,该属性 然而促销是空的。

我已在自动生成的元数据类中的属性 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; }
        }
    }

I'm encountering an issue using Silverlight4, Ria Services and Entity Framework.

From my sl client I try to get some data through ria services, in my domainService class this method gets called:

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

when I check the contents of the list, in debug mode, it's filled with objects of type LastMinuteWachtLijstPromotie.
these objects have a navigation property to an Object named Promotie.
And i can access the properties of these Promotie objects.

On the silveright client however a method gets invoked when loading is complete:

public void OnLoadEntitiesCompleted(ServiceLoadResult<T> result) {

}

In this method I get all the requested LastMinuteWachtLijstPromotie objects as expected, the property
Promotie however is null.

I have set the [Include] tag on the property Promotie in the auto generated metadata class
and I use the .Include("Promotie")

These same methods are used for different objects from my Domain Model, this works perfectly.
Also, I cannot seem to find differences in the .edmx file with the database mappings and navigation properties.

Has anyone encountered the same issue or know a solution for it?

the metadata classes:

[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; }
        }
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

瀟灑尐姊 2024-12-02 09:53:34

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

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

Add the Composition attribute to the property Promotie property of the LastMinuteWachtLijstPromotieMetadata class. Then it should work.

public partial class LastMinuteWachtLijstPromotie {
  internal sealed class LastMinuteWachtLijstPromotieMetadata{
    [Include]
    [Composition]
    public Promotie Promotie { get; set; }
  }
}
剩一世无双 2024-12-02 09:53:34

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

我目前正在使用 Silverlight 5,这对我有用(我认为 SL4 IIRC 中的过程是相同的)。

当向客户端传播导航属性时,您需要使用 [Key] 和 [Association] 属性告诉 RIA 服务某处存在关系,这与实体框架不同,只是描述如何将关系映射到正确的对象。

首先是元数据类:

[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("Category").Include( “SubCategory”)就像一个魅力!)

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

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

I know this is an older thread and it may well have been answered elsewhere but I just stumbled upon it and since nobody has provided a link or a better answer.

I'm currently using Silverlight 5 and this is what worked for me (I think the process is the same in SL4 IIRC).

When propegating navigation properties to the client you need to tell RIA services that there is a relationship somewhere using the [Key] and [Association] attributes, this, not unlike the entity framework just describes how to map the relationship to the proper object.

First the metadata classes:

[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; }
    }
}

Now we need to tell RIA services we want it to load the association:
(Note: Intellisense says it's a dot separated list of property names to include, however I tried something like .Include("Category.SubCategory") and this failed with an exception... though .Include("Category").Include("SubCategory") worked like a charm!)

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

I can now access my "Category" property from the Silverlight client and it is not NULL :)

蹲墙角沉默 2024-12-02 09:53:34

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

我的所有配置内容也都是正确的(对于 RIA S,[Include],对于 EF,Include()),但在 Silverlight 端,导航属性仍然​​为空。

事实证明,域服务方法使用了 [Invoke] 属性(并返回 IEnumerable)。删除这个属性解决了这个问题。

(仅供记录,使用 [Invoke] 是因为该方法具有 List 参数)

Same as SilverX: just had the issue, solved it and thought it could be useful to someone.

I too had all the configuration stuff correct ([Include] for RIA S, Include() for EF) but a navigation property was still null on the Silverlight side.

Turns out the domain service method was using the [Invoke] attribute (and returning a IEnumerable<T>). Removing this attribute solved the issue.

(just for the record, [Invoke] was being used because the method had a List<Entity> parameter)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文