Я использую Entity Framework 4 и SQL Server 2008 R2.У меня есть ситуация, когда я хотел бы вставить запись, чьи поля первичного ключа могут соответствовать существующей записи.Вместо повышения и ошибки, я бы хотел, чтобы существующая запись молча обновлялась новыми данными.
Моя текущая реализация выглядит примерно так:
// Calculate primary key fields.
DateTime endDate = periodTime.AddMinutes(periodMins);
int meterId = pipe.MeterId;
// Try to load a matching record.
ProfileDatum lpRec = context.ProfileData.FirstOrDefault(rec => rec.MeterId == meterId && rec.EndDate == endDate);
// If it could not be loaded, create a new one.
if (lpRec == null)
{
lpRec = new ProfileDatum() {MeterId = meterId,
EndDate = endDate};
// Save the object in the context.
context.ProfileData.AddObject(lpRec);
}
// Fill lpRec.
Это работает, но этодовольно ужасно по эффективности, удобочитаемости и элегантности.
Придерживаясь Entity Framework и SQL Server 2008 R2, есть ли способ сделать что-то вроде MySQL «при обновлении дублированного ключа», где я продолжаю, как будто создаю новую записькаждый раз и обновлять базу данных, когда есть нарушение первичного ключа?Или, может быть, есть какой-то другой элегантный подход?
Эффективность хороша, но вторична в этом случае;это простота, я после.Было бы замечательно иметь возможность написать это следующим образом и опустить проверку на стороне клиента:
// Assign primary key fields.
var lpRec = new ProfileDatum()
{
MeterId = pipe.MeterId,
EndDate = periodTime.AddMinutes(periodMins)
};
// Fill lpRec.
// Save the object in the context.
context.ProfileData.AddObject(lpRec);
Заранее благодарен за любую помощь, даже если это говорит о том, что моя существующая реализация - лучший способ.