EF -код первым: конфигурация модели
-
25-10-2019 - |
Вопрос
Я постараюсь быть максимально ясным:
Моя цель: прочитать конфигурацию модели, которую я объявил в своем переопределении OnModelCreating
внутри моего класса сущности, полученного из DbContext
.
Причина: построить общий void Update<T>(T toUpdate)
Метод на моем уровне данных, где я получаю, какие поля являются основным ключом для T, извлеките их на прошедшие toUpdate
объект и используйте их в Set<T>().Find
метод
Это позволило бы мне не жестко код найти логику для каждого типа объекта, с которыми я обращаюсь.
Мне нужно получить хранимую сущность для применения обновлений, например:
var retrievedItem = _entities.Set<T>().Find(myRetrievedKeyValues);
_entities.Entry(retrievedItem).CurrentValues.SetValues(toUpdate);
Я застрял в точке, что в моем _entities
экземпляр (который является моим классом сущностей, полученный из DbContext
Конечно) я не могу найти, где хранится конфигурация модели.
Кто -нибудь может указать мне в правильном направлении?
Спасибо.
Решение
Вы можете найти код, как получить имена свойств ключа типа объекта YourEntity
здесь:
Сначала код фреймворта. Найдите первичный ключ
А затем получить значения:
public Update<T>(T toUpdate)
{
// Code from link above with YourEntity = T
List<object> myRetrievedKeyValues = new List<object>();
foreach (var keyName in keyNames)
myRetrievedKeyValues.Add(toUpdate.GetType().GetProperty(keyName)
.GetValue(toUpdate, null));
var retrievedItem = _entities.Set<T>().Find(myRetrievedKeyValues.ToArray());
_entities.Entry(retrievedItem).CurrentValues.SetValues(toUpdate);
}
Ожидайте, что у вас будет довольно медленный Update
Метод, потому что вы должны использовать отражение для этого общего подхода.
Также не забывайте, что CurrentValues.SetValues
будет обновлять только скалярные и сложные свойства. Это не помогает вам обновить свойства навигации. Вам придется использовать негенерический код для обновления отношений, которые относятся к каждому типу объекта.