Я хотел бы использовать Breeze для работы со службой OData. Я потратил часы, пытаясь запустить это, но не нашел решения, поэтому я действительно надеюсь, что кто-нибудь может помочь!? (Я только начал использовать бриз, так что извините, если я упустил здесь что-то «очевидное».)
Я хотел бы использовать коллекцию подобъектов (ComplexType). т.е. Я хотел бы, чтобы мой класс сущности имел свойство коллекции, подобное этому:
public List<Address> addresses { get; set; }
(Адрес — это не сущность, которая сохраняется сама по себе в коллекции БД, а простой класс с некоторыми свойствами (ComplexType))
Сервер представляет собой службу ODATA WebAPI MVC4, основанную на классах Entity Framework Code First POCO, которые сохраняются в базе данных MongoDB.
В браузере я получаю следующую ошибку, когда библиотека breeze пытается прочитать метаданные 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; }
}
Если я запрашиваю метаданные ODATA с помощью браузера (http://localhost:56936/odata/$metadata
), я получаю следующий результат:
<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"
}
]
}