Запись в динамический столбец в базе данных EF - PullRequest
0 голосов
/ 24 февраля 2019

В настоящее время у меня много операторов if при сохранении данных в моей базе данных, поскольку столбец изменяется динамически.Мой код был бы намного эффективнее, если бы я мог использовать строку «name» для динамического изменения столбца, который мне нужно сохранить.

        if (String.Compare(name, "MWSAccessKeyID", StringComparison.Ordinal) == 0) 
        {               
                var DBobj = db.AccountsConfigDatas.Find(0);
                DBobj.MWSAccessKeyID = NewValue;
                db.Entry(DBobj).State = EntityState.Modified;
                db.SaveChanges();               
        }

Что я пробовал: У меня естьисследовал эту тему в течение пары часов.Я считаю, что я использую неправильные условия поиска, потому что там не так много.Я попытался найти столбец, используя строку имени в LINQ.

                var Column = DBobj
                            .Where(e == name)                    
                            .Select(e)
                            .FirstOrDefault();

                DBobj.Column = NewValue;
                db.Entry(DBobj).State = EntityState.Modified;
                db.SaveChanges();

Любые предложения или документы сообщества будут очень полезны.

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Кажется, что X-editable заставляет вас обновлять свойства по имени.По моему мнению, ваша архитектура не должна позволять особенностям библиотеки UI проникать в более глубокие области кода вашего приложения.Рекомендуется слой абстракции / отображения между контроллерами и DAL (или службами).

В любом случае, если у вас его нет, с Entity Framework легко изменять свойства по имени.Отражение не требуется, потому что EF кэшировал метаданные модели сущностей:

var dbObj = db.AccountsConfigDatas.Find(id);
db.Entry(dbObj).CurrentValues[propertyName] = newValue;
db.SaveChanges();               

Это обновляет одно свойство по имени и помечает это единственное свойство как измененное, поэтому только это свойство будет в операторе обновления.Неправильно устанавливать состояние объекта как измененное, поскольку оно генерирует оператор обновления, содержащий все его свойства.

0 голосов
/ 25 февраля 2019
            var DBobj = db.AccountsConfigDatas.Find(0);
            var propertyInfo = DBobj.GetType().GetProperty(name); 
            propertyInfo.SetValue(DBobj, NewValue);                
            db.Entry(DBobj).State = EntityState.Modified;
            db.SaveChanges();               

Документация: Type.GetProperty ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...