2014-01-20 28 views
0

我想使用Breeze處理OData服務。我花了幾個小時試圖讓這個運行,但我沒有找到解決方案,所以我真的希望有人能幫助!? (我剛開始使用微風 - 所以我很抱歉,如果我在這裏缺少「明顯」的東西。)odata breeze:ComplexType的集合: - 「TypeError:無法調用方法'_createInstanceCore ...」

我想要做的是使用子對象集合(ComplexType)。即我想我的實體類有一個集合屬性是這樣的:

public List<Address> addresses { get; set; } 

(地址是沒有實體,是在DB集合自身的堅持,但一個簡單的類的一些屬性(的ComplexType))

服務器是一個MVC4 WebAPI ODATA服務,它基於持久化在MongoDB數據庫中的實體框架代碼優先POCO類。

在瀏覽器中我得到以下錯誤,當微風庫嘗試從服務器讀取的ODATA元數據(它甚至不查詢例子集合,它有前一個錯誤):

[Q] Unhandled rejection reasons (should be empty): 
["TypeError: Cannot call method '_createInstanceCore…://localhost:56936/scripts/breeze.debug.js:236:26"] 

有沒有辦法讓這個運行?

謝謝!

我的客戶端代碼如下所示:

var serverAddress = "http://localhost:56936/odata"; 
breeze.config.initializeAdapterInstances({ dataService: "OData" }); 
var manager = new breeze.EntityManager(serverAddress); 

var query = breeze.EntityQuery.from("BreezeExample"); 
manager.executeQuery(query).then(querysucceeded).fail(queryfailed); 

function querysucceeded(data) { 
    console.log("querysucceeded"); 
    data.results.forEach(function (item) { 
     //... 
    }); 
} 

function queryfailed(e) { 
    console.log("!!! queryfailed"); 
    console.log(e); 
} 

的模型如下:

[BsonIgnoreExtraElements] 
public class ExampleClass : MongoEntity 
{ 
    [BsonRepresentation(BsonType.ObjectId)] 
    public string Id { get; set; } 
    public string loginEmail { get; set; } 
    public bool? active { get; set; } 
    public ICollection<Address> addresses { get; set; } //THIS DOES NOT WORK CLIENT SIDE - WHY? 
} 

public class Address 
{ 
    public string place { get; set; } 
    public string street { get; set; } 
    public string houseNumber { get; set; } 
    public string postalCode { get; set; } 
} 

如果我查詢使用瀏覽器(http://localhost:56936/odata/$metadata)的ODATA元,我得到這樣的結果:

<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" Version="1.0"> 
    <edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="3.0" m:MaxDataServiceVersion="3.0"> 
    <Schema xmlns="http://schemas.microsoft.com/ado/2009/11/edm" Namespace="MvcWebRole1.Models.MongoDB.Entities"> 
     <EntityType Name="ExampleClass"> 
     <Key> 
      <PropertyRef Name="Id" /> 
     </Key> 
     <Property Name="loginEmail" Type="Edm.String" /> 
     <Property Name="active" Type="Edm.Boolean" /> 
     <Property Name="addresses" Type="Collection(MvcWebRole1.Models.MongoDB.Entities.Address)" Nullable="false" /> 
     <Property Name="Id" Type="Edm.String" Nullable="false" /> 
     </EntityType> 
     <ComplexType Name="Address"> 
     <Property Name="place" Type="Edm.String" /> 
     <Property Name="street" Type="Edm.String" /> 
     <Property Name="houseNumber" Type="Edm.String" /> 
     <Property Name="postalCode" Type="Edm.String" /> 
     </ComplexType> 
     <EntityContainer Name="Container" m:IsDefaultEntityContainer="true"> 
     <EntitySet Name="BreezeExample" EntityType="MvcWebRole1.Models.MongoDB.Entities.ExampleClass" /> 
     </EntityContainer> 
    </Schema> 
    </edmx:DataServices> 
</edmx:Edmx> 

如果我查詢BreezeExample集合(http://localhost:56936/odata/BreezeExample)我得到這樣的:

{ 
    odata.metadata: "http://localhost:56936/odata/$metadata#BreezeExample", 
    value: [ 
    { 
     loginEmail: "loginEmail1", 
     active: true, 
     addresses: [ 
     { 
      place: "place", 
      street: "street", 
      houseNumber: "77", 
      postalCode: "123" 
     }, 
     { 
      place: "place2", 
      street: "street", 
      houseNumber: "77", 
      postalCode: "123" 
     } 
     ], 
     Id: "1" 
    }, 
    { 
     loginEmail: "loginEmail2", 
     active: true, 
     addresses: [ 
     { 
      place: "place", 
      street: "street", 
      houseNumber: "77", 
      postalCode: "123" 
     }, 
     { 
      place: "place", 
      street: "street", 
      houseNumber: "77", 
      postalCode: "123" 
     } 
     ], 
     Id: "2" 
    } 
    ] 
} 

回答

0

我設法修復部分通過做題如下:

首先,事實證明,微風不理解Collection(MvcWebRole1.Models.MongoDB.Entities.Address)類型;所以它不能創建適當的dataType屬性。這可能是你得到錯誤的原因。 我改變了類型,像Edm.Self.Address。

我做的另一個變化是在parseCsdlComplexProperty函數中。我增加了一條固定一切的線。

var dp = new DataProperty({ 
     nameOnServer: csdlProperty.name, 
     complexTypeName: complexTypeName, 
     isScalar: csdlProperty.isScalar, // LINE ADDED 
     isNullable: false 
    }); 

只是爲了回顧一下,我metada文件包含以下內容片斷

{ 
    "name": "ColourByType", 
    "key": { 
     "propertyRef": { 
     "name": "Id" 
     } 
    }, 
    "property": [ 
     { 
     "name": "Id", 
     "type": "Edm.Int32", 
     "nullable": "false", 
     "annotation:StoreGeneratedPattern": "Identity" 
     }, 
     { 
     "name": "Options", // This is the list that holds the instance of my complex type 
     "type": "Edm.Self.ColourByOption", // This is the complex type that is stored in the list 
     "isScalar": false 
     } 
    ] 
    } 

我敢肯定,這個解決方案並不理想,但它爲我工作。

我問了一個類似的問題;所以你可能想保持它的眼睛,以及

https://stackoverflow.com/questions/21258015/breezejs-metadata-is-missing-information-about-complex-properties

+0

你可以看一下這個網頁,看看如何可以從腳本導入元數據http://www.breezejs.com/documentation/load - 元數據腳本 – ppoliani

相關問題