Вопрос

Я постараюсь быть максимально ясным:

Моя цель: прочитать конфигурацию модели, которую я объявил в своем переопределении 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 будет обновлять только скалярные и сложные свойства. Это не помогает вам обновить свойства навигации. Вам придется использовать негенерический код для обновления отношений, которые относятся к каждому типу объекта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top