Проблема в службе данных ADO.Net при работе с Entity Model - PullRequest
1 голос
/ 02 января 2011

Я просто пытаюсь изучить ADO.Net Data Services WCF Data Services.

Я только что создал пример программы, в которой у меня есть Entity Data Model базы данных Northwind, и я схватилПродукты, категории и поставщики в моей модели объектов.

Затем я добавил класс, который выглядит как

[DataServiceKey("ProductID")]
public class ProductsService
{
   public ProductsService()
   {
   }

   public IQueryable<Product> Products
   {
      get
      {
         NORTHWNDEntities db = new NORTHWNDEntities();
         return db.Products.AsQueryable();
      }
   }
}

Затем у меня есть файл службы данных WCF, который выглядит как

public class ProductsDataService : DataService<ProductsService>
{       
    public static void InitializeService(DataServiceConfiguration config)
    {       
        config.SetEntitySetAccessRule("*", EntitySetRights.All);            
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
    }
}

Я знаю, что могу использовать класс NorthwindDataEntities, тогда он работает, но если я пытаюсь использовать свой класс ProductsService, у меня возникает проблема Ошибка запроса ...

Любая идея, что здесь происходит не так, пожалуйста...

Класс автоматически сгенерированного продукта выглядит следующим образом, я добавил атрибут DataServiceKey ..

 [EdmEntityTypeAttribute(NamespaceName="NORTHWNDModel", Name="Product")]
 [Serializable()]
 [DataContractAttribute(IsReference=true)]
 [DataServiceKey("ProductID")] 
 public partial class Product : EntityObject
 {
      #region Factory Method
      public static Product CreateProduct(global::System.Int32 productID, global::System.String productName, global::System.Boolean discontinued)
      {
            Product product = new Product();
            product.ProductID = productID;
            product.ProductName = productName;
            product.Discontinued = discontinued;
            return product;
      }

      #endregion
      #region Primitive Properties

      /// <summary>
      /// No Metadata Documentation available.
      /// </summary>
      [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
      [DataMemberAttribute()]
      public global::System.Int32 ProductID
      {
            get
            {
                 return _ProductID;
            }
            set
            {
                 if (_ProductID != value)
                 {
                      OnProductIDChanging(value);
                      ReportPropertyChanging("ProductID");
                      _ProductID = StructuralObject.SetValidValue(value);
                      ReportPropertyChanged("ProductID");
                      OnProductIDChanged();
                 }
            }
      }
      private global::System.Int32 _ProductID;
      partial void OnProductIDChanging(global::System.Int32 value);
      partial void OnProductIDChanged();

      /// <summary>
      /// No Metadata Documentation available.
      /// </summary>
      [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
      [DataMemberAttribute()]
      public global::System.String ProductName
      {
            get
            {
                 return _ProductName;
            }
            set
            {
                 OnProductNameChanging(value);
                 ReportPropertyChanging("ProductName");
                 _ProductName = StructuralObject.SetValidValue(value, false);
                 ReportPropertyChanged("ProductName");
                 OnProductNameChanged();
            }
      }
      private global::System.String _ProductName;
      partial void OnProductNameChanging(global::System.String value);
      partial void OnProductNameChanged();

      /// <summary>
      /// No Metadata Documentation available.
      /// </summary>
      [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
      [DataMemberAttribute()]
      public Nullable<global::System.Int32> SupplierID
      {
            get
            {
                 return _SupplierID;
            }
            set
            {
                 OnSupplierIDChanging(value);
                 ReportPropertyChanging("SupplierID");
                 _SupplierID = StructuralObject.SetValidValue(value);
                 ReportPropertyChanged("SupplierID");
                 OnSupplierIDChanged();
            }
      }
      private Nullable<global::System.Int32> _SupplierID;
      partial void OnSupplierIDChanging(Nullable<global::System.Int32> value);
      partial void OnSupplierIDChanged();

      /// <summary>
      /// No Metadata Documentation available.
      /// </summary>
      [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
      [DataMemberAttribute()]
      public Nullable<global::System.Int32> CategoryID
      {
            get
            {
                 return _CategoryID;
            }
            set
            {
                 OnCategoryIDChanging(value);
                 ReportPropertyChanging("CategoryID");
                 _CategoryID = StructuralObject.SetValidValue(value);
                 ReportPropertyChanged("CategoryID");
                 OnCategoryIDChanged();
            }
      }
      private Nullable<global::System.Int32> _CategoryID;
      partial void OnCategoryIDChanging(Nullable<global::System.Int32> value);
      partial void OnCategoryIDChanged();

      /// <summary>
      /// No Metadata Documentation available.
      /// </summary>
      [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
      [DataMemberAttribute()]
      public global::System.String QuantityPerUnit
      {
            get
            {
                 return _QuantityPerUnit;
            }
            set
            {
                 OnQuantityPerUnitChanging(value);
                 ReportPropertyChanging("QuantityPerUnit");
                 _QuantityPerUnit = StructuralObject.SetValidValue(value, true);
                 ReportPropertyChanged("QuantityPerUnit");
                 OnQuantityPerUnitChanged();
            }
      }
      private global::System.String _QuantityPerUnit;
      partial void OnQuantityPerUnitChanging(global::System.String value);
      partial void OnQuantityPerUnitChanged();

      /// <summary>
      /// No Metadata Documentation available.
      /// </summary>
      [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
      [DataMemberAttribute()]
      public Nullable<global::System.Decimal> UnitPrice
      {
            get
            {
                 return _UnitPrice;
            }
            set
            {
                 OnUnitPriceChanging(value);
                 ReportPropertyChanging("UnitPrice");
                 _UnitPrice = StructuralObject.SetValidValue(value);
                 ReportPropertyChanged("UnitPrice");
                 OnUnitPriceChanged();
            }
      }
      private Nullable<global::System.Decimal> _UnitPrice;
      partial void OnUnitPriceChanging(Nullable<global::System.Decimal> value);
      partial void OnUnitPriceChanged();

      /// <summary>
      /// No Metadata Documentation available.
      /// </summary>
      [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
      [DataMemberAttribute()]
      public Nullable<global::System.Int16> UnitsInStock
      {
            get
            {
                 return _UnitsInStock;
            }
            set
            {
                 OnUnitsInStockChanging(value);
                 ReportPropertyChanging("UnitsInStock");
                 _UnitsInStock = StructuralObject.SetValidValue(value);
                 ReportPropertyChanged("UnitsInStock");
                 OnUnitsInStockChanged();
            }
      }
      private Nullable<global::System.Int16> _UnitsInStock;
      partial void OnUnitsInStockChanging(Nullable<global::System.Int16> value);
      partial void OnUnitsInStockChanged();

      /// <summary>
      /// No Metadata Documentation available.
      /// </summary>
      [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
      [DataMemberAttribute()]
      public Nullable<global::System.Int16> UnitsOnOrder
      {
            get
            {
                 return _UnitsOnOrder;
            }
            set
            {
                 OnUnitsOnOrderChanging(value);
                 ReportPropertyChanging("UnitsOnOrder");
                 _UnitsOnOrder = StructuralObject.SetValidValue(value);
                 ReportPropertyChanged("UnitsOnOrder");
                 OnUnitsOnOrderChanged();
            }
      }
      private Nullable<global::System.Int16> _UnitsOnOrder;
      partial void OnUnitsOnOrderChanging(Nullable<global::System.Int16> value);
      partial void OnUnitsOnOrderChanged();

      /// <summary>
      /// No Metadata Documentation available.
      /// </summary>
      [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
      [DataMemberAttribute()]
      public Nullable<global::System.Int16> ReorderLevel
      {
            get
            {
                 return _ReorderLevel;
            }
            set
            {
                 OnReorderLevelChanging(value);
                 ReportPropertyChanging("ReorderLevel");
                 _ReorderLevel = StructuralObject.SetValidValue(value);
                 ReportPropertyChanged("ReorderLevel");
                 OnReorderLevelChanged();
            }
      }
      private Nullable<global::System.Int16> _ReorderLevel;
      partial void OnReorderLevelChanging(Nullable<global::System.Int16> value);
      partial void OnReorderLevelChanged();

      /// <summary>
      /// No Metadata Documentation available.
      /// </summary>
      [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
      [DataMemberAttribute()]
      public global::System.Boolean Discontinued
      {
            get
            {
                 return _Discontinued;
            }
            set
            {
                 OnDiscontinuedChanging(value);
                 ReportPropertyChanging("Discontinued");
                 _Discontinued = StructuralObject.SetValidValue(value);
                 ReportPropertyChanged("Discontinued");
                 OnDiscontinuedChanged();
            }
      }
      private global::System.Boolean _Discontinued;
      partial void OnDiscontinuedChanging(global::System.Boolean value);
      partial void OnDiscontinuedChanged();

      #endregion

      #region Navigation Properties

      /// <summary>
      /// No Metadata Documentation available.
      /// </summary>
      [XmlIgnoreAttribute()]
      [SoapIgnoreAttribute()]
      [DataMemberAttribute()]
      [EdmRelationshipNavigationPropertyAttribute("NORTHWNDModel", "FK_Products_Categories", "Categories")]
      public Category Category
      {
            get
            {
                 return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Category>("NORTHWNDModel.FK_Products_Categories", "Categories").Value;
            }
            set
            {
                 ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Category>("NORTHWNDModel.FK_Products_Categories", "Categories").Value = value;
            }
      }
      /// <summary>
      /// No Metadata Documentation available.
      /// </summary>
      [BrowsableAttribute(false)]
      [DataMemberAttribute()]
      public EntityReference<Category> CategoryReference
      {
            get
            {
                 return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Category>("NORTHWNDModel.FK_Products_Categories", "Categories");
            }
            set
            {
                 if ((value != null))
                 {
                      ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<Category>("NORTHWNDModel.FK_Products_Categories", "Categories", value);
                 }
            }
      }

      /// <summary>
      /// No Metadata Documentation available.
      /// </summary>
      [XmlIgnoreAttribute()]
      [SoapIgnoreAttribute()]
      [DataMemberAttribute()]
      [EdmRelationshipNavigationPropertyAttribute("NORTHWNDModel", "FK_Order_Details_Products", "Order_Details")]
      public EntityCollection<Order_Detail> Order_Details
      {
            get
            {
                 return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<Order_Detail>("NORTHWNDModel.FK_Order_Details_Products", "Order_Details");
            }
            set
            {
                 if ((value != null))
                 {
                      ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<Order_Detail>("NORTHWNDModel.FK_Order_Details_Products", "Order_Details", value);
                 }
            }
      }

      /// <summary>
      /// No Metadata Documentation available.
      /// </summary>
      [XmlIgnoreAttribute()]
      [SoapIgnoreAttribute()]
      [DataMemberAttribute()]
      [EdmRelationshipNavigationPropertyAttribute("NORTHWNDModel", "FK_Products_Suppliers", "Suppliers")]
      public Supplier Supplier
      {
            get
            {
                 return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Supplier>("NORTHWNDModel.FK_Products_Suppliers", "Suppliers").Value;
            }
            set
            {
                 ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Supplier>("NORTHWNDModel.FK_Products_Suppliers", "Suppliers").Value = value;
            }
      }
      /// <summary>
      /// No Metadata Documentation available.
      /// </summary>
      [BrowsableAttribute(false)]
      [DataMemberAttribute()]
      public EntityReference<Supplier> SupplierReference
      {
            get
            {
                 return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Supplier>("NORTHWNDModel.FK_Products_Suppliers", "Suppliers");
            }
            set
            {
                 if ((value != null))
                 {
                      ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<Supplier>("NORTHWNDModel.FK_Products_Suppliers", "Suppliers", value);
                 }
            }
      }

      #endregion
 }   

Ответы [ 2 ]

0 голосов
/ 04 января 2011

Без точной ошибки трудно угадать, в чем проблема. Но в целом это не сработает. Причина заключается в разнице в поведении IQueryable между LINQ to EF и LINQ to Objects. Если вы укажете ObjectContext (NorthwindEntities в вашем случае) в качестве контекста для службы данных, службы данных WCF примут поведение LINQ to EF и сгенерируют запросы таким образом, что LINQ to EF сможет его обработать. Если вы указываете не-ObjectContext класс (ваш собственный в данном случае) в качестве контекста для службы данных, он принимает поведение LINQ to Objects и генерирует несколько другие запросы. Основным отличием является распространение нуля (LINQ to Objects требует явного распространения нуля, в то время как LINQ to EF это не нравится и обрабатывает это косвенно), но есть и другие меньшие различия. Вы действительно должны использовать свой собственный класс в качестве контекста, а не сгенерированный EF класс на основе ObjectContext?

0 голосов
/ 02 января 2011

Вы не показали нам свой Product класс - в этом классе должна быть [DataServiceKey("ProductID")], чтобы дать понять DataService, как идентифицировать продукт:

[DataServiceKey("ProductID")]
public partial class Product
{
   public int ProductID { get; set; }
   ...
}

С этим, я думаю, ваш подход должен работать.

Если нет: пожалуйста, сообщите нам, что ошибка точная !

...