Я пишу 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 в большем количестве проектов, поэтому я бы предпочел не просто изучать выдумки ^ _ ^
Спасибо за любой совет