2011-01-01 10 views
1

Ich versuche nur zu lernen ADO.Net Data Services WCF Data Services.Problem in ADO.Net Data Service beim Arbeiten mit Entity Model

Ich habe gerade ein Beispielprogramm erstellt, wo ich Entity Data Model der Northwind-Datenbank habe und ich habe Produkte, Kategorie und Lieferanten-Entitäten in meinem Entitätsmodell gegriffen.

Dann habe ich eine Klasse hinzugefügt, die

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

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

Dann wie

sieht ich eine WCF Data Service-Datei, die wie

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

ich mir die NorthwindDataEntities Klasse verwendet, kann wissen, sieht dann funktioniert es aber wenn ich versuche, meine Products Klasse zu verwenden, erhalte ich anfordern Fehler Problem ...

Jede Idee, was hier los ist falsch bitte ...

Die automatisch generierten Produktklasse wird wie folgt, ich DataServiceKey Attribut hinzugefügt haben ..

[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 
} 
+0

Das Ding wurde vor fast zwei Jahren ** WCF Data Services ** umbenannt ... nicht mehr ADO.NET Data Services ... –

Antwort

0

Sie uns nicht zeigen Sie Ihre Product Klasse - die Klasse der [DataServiceKey("ProductID")] drauf haben muss - um es zu machen, klar zum DataService, wie man ein Produkt identifiziert:

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

Mit diesem, ich denke, dass Ihr Ansatz sollte funktionieren.

Wenn nicht: bitte lassen Sie uns wissen, was der genaue Fehler ist!

0

Ohne den genauen Fehler ist es schwer zu erraten, was das eigentliche Problem ist. Aber im Allgemeinen wird das nicht funktionieren. Der Grund ist der Unterschied im Verhalten von IQueryable zwischen dem LINQ to EF und LINQ to Objects. Wenn Sie den ObjectContext (NorthwindEntities in Ihrem Fall) als Kontext für den Datendienst angeben, wird von den WCF Data Services das LINQ to EF-Verhalten angenommen, und die Abfragen werden so generiert, dass LINQ to EF damit umgehen kann. Wenn Sie eine Nicht-ObjectContext-Klasse (in diesem Fall Ihre eigene) als Kontext für den Datendienst angeben, wird LINQ to Objects-Verhalten vorausgesetzt und es werden etwas andere Abfragen generiert. Der Hauptunterschied ist die Null-Propagierung (LINQ to Objects erfordert eine explizite Null-Propagation, während LINQ to EF es nicht mag und implizit behandelt), aber es gibt auch andere kleinere Unterschiede. Müssen Sie wirklich Ihre eigene Klasse als Kontext und nicht die EF-generierte ObjectContext-basierte Klasse verwenden?

Verwandte Themen