Как обновить модель в базе данных, начиная с asp.net MVC2, используя Entity Framework?
Я создаю приложение ASP.NET MVC2 и использую Entity Framework в качестве ORM. У меня проблемы с обновлением объекта в базе данных. Каждый раз, когда я пытаюсь использовать entity.SaveChanges(), EF вставляет новую строку в таблицу независимо от того, хочу ли я выполнить обновление или вставку. Я попытался прикрепить (как в следующем примере) объект к объекту, но потом я получил
{"An object with a null EntityKey value cannot be attached to an object context."}
Вот моя простая функция для вставок и обновлений (на самом деле это не относится к транспортным средствам, но проще объяснить, как это, хотя я не думаю, что этот эффект отвечает вообще)...
public static void InsertOrUpdateCar(this Vehicles entity, Cars car)
{
if (car.Id == 0 || car.Id == null)
{
entity.Cars.AddObject(car);
}
else
{
entity.Attach(car);
}
entitet.SaveChanges();
}
Я даже пытался использовать AttachTo("Автомобили", автомобиль), но я получил то же исключение.
Кто-нибудь имеет опыт работы с этим?
3 ответа
Если вы обновляете существующую запись, то вы должны иметь EntityKey в экземпляре объекта, который вы предоставляете своему методу InsertOrUpdate. Вернитесь к своему коду и посмотрите, сможете ли вы найти, где это теряется. Я подозреваю, что вы предоставляете пользователю форму для обновления этого объекта, а затем отображаете поля ответа обратно в объект Car, но вы не передаете EntityKey с ним (вы, вероятно, не хотите отображать его пользователю).
Что вам нужно сделать, это включить ключ в форму, используя тип ввода "скрытый". Вы можете использовать Html helper Html.Hidden("Имя ключевого поля", значение ключевого поля), чтобы убедиться, что он передается в пользовательскую форму, а затем возвращается в ваш почтовый код.
Я могу дать вам грубое руководство, но ваш код выше не дает мне кучу работы с.
Вы хотели бы сделать что-то вроде:
using(Entities dataModel = new Entities())
{
if(car.Id == 0 || car.Id == null)
{
dataModel.AddToCars(car); /* There should be a generated method similar to
this that just takes a car object minus the Primary Key */
}
else
{
var selectedCar = dataModel.Cars.Where(x => x.Id == car.Id).FirstOrDefault();
if(selectedCar != null)
{
selectedCar.Name == car.Name;
// Continue updating your car stuff
}
}
dataModel.SaveChanges();
}
Другой подход, который некоторые могут счесть немного более элегантным:
IContext context = ContextFactory.GetContext();
EntityRepo repo = new EntityRepo(context); //Entity Repository
OtherTableEntity y = new OtherTableEntity() //this could be some other derived value you already have
//that uniquely identifies the record (or foreign key or other value you want to update)
Int32 id = 1234; //value to update to
var z = repo.TableToUpdate.List().Where(x => x.FK_ID == y.FK_ID).FirstOrDefault();
if (z != null)
{
z.FK_ID = id;
repo.Commit();
}
Сделать перерыв до и после repo.Commit();
и откройте окно SQL-запроса и запустите выборку из таблицы до и после repo.Commit()
,
Критерии добавления - это то, что вы хотите. Вызов repo.EntityToUpdate.Add(entity)
а также repo.Commit()
,