Какой из них мне следует использовать из соображений производительности?
Методы Database.Save
извлекают значение поля первичного ключа, используя GetValue
, затем вызывают Database.Insert
или Database.Update
соответственно.
Следовательно, вы должны использовать Database.Save
только в том случае, если вашему коду действительно нужно сохранить изменения в объекте, который может быть как новым, так и уже существующим. Также обратите внимание, что ваша таблица должна иметь автоинкрементный столбец первичного ключа, чтобы Database.Save
работал.
Даже без небольшой разницы в производительности, я бы предпочел правильную семантику - использовать вставку или обновление вместо сохранения.
Один не менее удобен для меня, чем другой ...
Это не совсем так.
Database.Insert(poco)
будет искать значения для tableName
и pkName
в пользовательских атрибутах определения вашего класса poco. Если вы используете шаблоны T4, эти значения будут автоматически синхронизироваться с вашей базой данных, и они будут указаны только в одном месте. С другой стороны, если вы передадите их в каждом вызове метода, они будут повторяться бесчисленное количество раз по всей вашей кодовой базе. DRY. Что если вам нужно изменить одно из значений позже?
Теперь, Database.Insert(poco)
будет немного менее производительным из-за этого поиска. Тем не менее, PetaPoco кэширует результат этого поиска в статическом словаре, поэтому влияние на производительность будет очень незначительным после первого поиска:
RWLock.EnterReadLock();
PocoData pd;
try
{
if (m_PocoDatas.TryGetValue(t, out pd))
return pd;
}
finally
{
RWLock.ExitReadLock();
}