odata breeze: Коллекция ComplexType: - TypeError: невозможно вызвать метод '_createInstanceCore…

Я хотел бы использовать 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"
    }
    ]
}

person vitr    schedule 20.01.2014    source источник


Ответы (1)


Мне удалось частично решить проблему, выполнив следующие действия:

Во-первых, оказывается, что Breeze не понимает тип 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
    });

Напомним, мой файл метада содержит следующий фрагмент

{
    "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

person ppoliani    schedule 22.01.2014
comment
На этой странице можно посмотреть, как можно импортировать метаданные из скрипта breezejs.com/ документация/скрипт загрузки метаданных - person ppoliani; 22.01.2014