Я создаю доказательство концепции для моей компании. У нас есть существующая платформа, которую мы будем постепенно заменять современными технологиями. В настоящее время я ограничен использованием наших существующих баз данных, которые имеют несколько таблиц без ключей. Я создаю приложение Blazor WebAssembly, которое вызывает базовое веб-приложение. net с использованием gRP C. Моя проблема в том, что я использую EF Core для связи с существующими базами данных, но я получаю исключение при вызове DbContext.Attach(shipment)
"The navigation '' cannot be added because it targets the keyless entity type 'Document'. Navigations can only target entity types with keys."
Document
- это свойство навигации для сущности, Attach
редактируемой для DbContext
.
Shipment
- это очень большая и сложная структура данных, охватывающая многие уровни. Есть ли способ избежать необходимости устанавливать состояние объекта для каждого объекта, DbContext.Entry(entity).State = EntityState.Added
, в структуре модели?
Или, возможно, отобразить операции CRUD DbSet на хранимые процедуры?
РЕДАКТИРОВАТЬ
Вот резко сокращенная версия схемы, но это все, что имеет отношение к проблеме.
public class Shipment
{
public int Id { get; set; }
// 60 other properties
public virtual ICollection<Document> Documents { get; set; }
}
public class Document
{
public int ShippingId { get; set; }
public string DocumentType { get; set; }
public byte[] Content { get; set; }
public virtual Shipment Shipment { get; set; }
}
Когда я пытаюсь прикрепить Shipment
сущности на DbContext
или вручную установите ее состояние, я получаю исключение выше.
Опять же, я не могу изменить схему базы данных в настоящее время, и есть много других моделей, подобных Document
, у которых нет ключа или средства его добавления.
РЕДАКТИРОВАТЬ 2
Я понимаю, что это требует дальнейшего объяснения. Очевидно, что DbContext
не сможет вставить / обновить / удалить, поскольку без ключа он не знает, как это сделать. Все, что мне нужно, это уметь читать при получении сущности Shipping
и установке свойства навигации Documents
. Но при сохранении Shipping
просто полностью игнорируйте свойство навигации.