2011-01-01 9 views
1

私はちょうど ADO.Netデータサービス WCF Data Servicesを習得しようとしています。エンティティモデルで作業する場合のADO.Netデータサービスの問題

私は、ノースウィンドデータベースのエンティティデータモデルを持つサンプルプログラムを作成しました。私は、エンティティモデル内の製品、カテゴリおよびサプライヤエンティティを取得しました。

その後、私はその後、私は私がNorthwindDataEntitiesクラスを使用することができます知っている

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

のように見えるWCFデータサービスファイルが、それはしかし、働く持っ

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

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

のように見えるクラスを追加しました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 
} 
+0

物事は、** WCF Data Services **に改名されました**ほぼ2年前... ADO.NET Data Services ... –

答えて

0

あなたは私達にあなたのProductクラスを示さなかった - そのクラスがそれに[DataServiceKey("ProductID")]を持っている必要があります - それを作るために、明確な製品を特定する方法のDataServiceに:これにより

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

、私はあなたのアプローチが動作するはずだと思います。

場合:正確なのエラーをお知らせください。

0

正確なエラーがなければ、実際の問題が何かを推測するのは難しいです。しかし、一般的にはこれはうまくいかないでしょう。理由は、LINQとEFとLINQとの間のIQueryableの動作の違いです。データサービスのコンテキストとしてObjectContext(ケースではNorthwindEntities)を指定すると、WCFデータサービスはLINQからEFへの動作を引き継ぎ、LINQからEFまで対応できるようにクエリを生成します。データサービスのコンテキストとしてObjectContext以外のクラス(この場合は独自のクラス)を指定すると、LINQ to Objectsビヘイビアが想定され、多少異なるクエリが生成されます。主な違いはヌル伝播です(LINQ to Objectsには明示的なヌル伝播が必要ですが、LINQ to EFではそれが気に入らず暗黙的に処理されます)が、他にも小さな違いがあります。 EFで生成されたObjectContextベースのクラスではなく、独自のクラスをコンテキストとして使用する必要がありますか?