Я не специалист по базам данных и SQL. Я занимаюсь разработкой базового приложения do tnet с использованием Entity Framework для доступа к базе данных (postgresql). У меня есть следующие таблицы со следующими столбцами:
Table: Log
Columns:
Timestamp: timestamp without time zone
Value: smallint
Status: smallint
Table: Status
ID: smallint
Name: character varying(30)
Когда я вставляю запись / строку в таблицу журнала, я хочу найти идентификатор, принадлежащий имени, в таблице состояния и заполнить значение в столбце Состояние в таблице журнала. Если Имя не найдено, я хочу вставить -1 в столбце Статус. Я реализовал это как:
Status status = null;
try {
status = context.Status.Single(a => a.Name == statusName);
} catch {}
var entry = new Log {
Timestamp = timestamp,
Value = value,
Status = (status != null) ? status.Id : Convert.ToInt16(-1)
};
context.Log.Add(entry);
context.SaveChanges();
Это работает. Я думаю, что это может быть реализовано более эффективно. Также есть некоторые проблемы с этой реализацией, я считаю. Например, когда я временно останавливаю базу данных, запрос идентификатора состояния завершается неудачно и выполняется вставка с -1. Когда база данных перезапускается, вставки все еще выполняются (я думаю, что Entity Framework обналичивает действия), но с -1 и неправильным значением. Когда вставка может быть выполнена как одно утверждение, я ожидаю / надеюсь, что будут вставлены правильные значения. Поэтому я хотел бы знать несколько вещей. Вот мои настоящие вопросы:
- Как я могу добиться этого, используя оператор SQL (в инструменте администрирования базы данных)?
- Как я могу реализовать его, используя Entity Framework так, что в базе данных выполняется один оператор SQL (и, таким образом, вставляются правильные данные, когда база данных временно закрыта)?