Как обновить модель в базе данных, начиная с asp.net MVC2, используя Entity Framework? - PullRequest
0 голосов
/ 27 апреля 2010

Я создаю приложение 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 ]

3 голосов
/ 27 апреля 2010

Я могу дать вам грубое руководство, но ваш код выше не дает мне кучу работы с.

Вы хотели бы сделать что-то вроде:

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();
}
1 голос
/ 03 марта 2011

Еще один подход, который некоторые могут счесть более элегантным:

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().

1 голос
/ 27 апреля 2010

Если вы обновляете существующую запись, то вы должны иметь EntityKey в экземпляре объекта, который вы предоставляете своему методу InsertOrUpdate. Вернитесь к своему коду и посмотрите, сможете ли вы найти, где это теряется. Я подозреваю, что вы предоставляете пользователю форму для обновления этого объекта, а затем отображаете поля ответа обратно в объект Car, но вы не передаете EntityKey с ним (вы, вероятно, не хотите отображать его пользователю ).

Что вам нужно сделать, это включить ключ в форму, используя тип ввода «скрытый». Вы можете использовать Html helper Html.Hidden («Имя ключевого поля», значение ключевого поля), чтобы убедиться, что он передается в пользовательскую форму, а затем возвращается в ваш почтовый индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...