Переполнение стека при создании модели oData из dbml - PullRequest
0 голосов
/ 24 марта 2020

Я пишу C# REST-бэкэнд для приложения openui5, использующего oData для больших наборов данных (подкачка на стороне сервера + фильтр).

У меня есть объект с именем Contact, которому можно назначить (связанный с) один или несколько клиентов. Мне нужно иметь возможность добавлять и удалять эти ассоциации из пользовательского интерфейса. Я создал связь в dbml из Контактов (дочерний: Клиенты, родительский: Контакт)

oData EDM выглядит так:

    private static IEdmModel GetEdmModel()
    {
        var builder = new ODataConventionModelBuilder();
        builder.EntitySet<ContactView>("ContactViews");
        return builder.GetEdmModel();
    }

До сих пор я нашел, как вызвать удалить функцию из Binding Context в пользовательском интерфейсе, но я получил ошибку:

Не удалось удалить / ContactViews (cb04fd07-f233-489d-a9ee-dc3091de899e) / Customers / 196 [196] - Ошибка: / ContactViews (cb04fd07-f233-489d-a9ee-dc3091de899e) / Клиенты / 196: не известен ключевой предикат в / ContactViews (cb04fd07-f233-489d-a9ee-dc3091de899e) / Customers / 196

Ok - поэтому я посмотрел это и добавил ключ к дочерней сущности Customer в edm Model:

    private static IEdmModel GetEdmModel()
    {
        var builder = new ODataConventionModelBuilder();

        //the link table has a (ContactId, CustomerId) PK but I can get that in the oData controller
        builder.EntityType<ContactCustomerView>().HasKey(c => c.CustomerId);
        var contact = builder.ComplexType<ContactView>();
        contact.HasMany(a => a.Customers);

        return builder.GetEdmModel();
    }

Boom! переполнение стека.

Я предполагаю, что, поскольку дочерний объект имеет ссылки на родительский объект в форме свойства Contact, он включает этот родительский / дочерний объект l oop в модель.

До этого момента я был довольно расстроен этим. Я собираюсь вручную удалить связь с новой, не oData, конечной точкой и refre sh oData. Может быть, это лучший способ, но я хотел бы знать, есть ли лучший способ. Планируется использовать openui5 в большем количестве проектов, поэтому я бы предпочел не просто изучать выдумки ^ _ ^

Спасибо за любой совет

...