Как обновить модель в базе данных, начиная с 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(),

Другие вопросы по тегам