Entity Framework: обновить сущность или добавить, если она не существует - PullRequest
5 голосов
/ 22 июня 2011

У меня есть сценарий, в котором я должен обновить сущность, если она существует, или добавить новую, если она не существует.

Я хотел бы выполнить для этого один метод (было бы здорово, если быэто была одна поездка на сервер).

Есть ли что-то подобное в EF?

Сейчас мой код выглядит так:

var entity = db.Entities.FirstOrDefault(e => e.Id == myId);
if (entity == null)
{
    entity = db.Entities.CreateObject();
    entity.Id = myId;
}

entity.Value = "my modified value";

db.SaveChanges();

Но я быхотел бы избежать первого запроса, что-то вроде этого:

var entity = new Entity();
entity.Id = myId;
entity.Value = "my modified value";
db.AddOrAttach(entity);
db.SaveChanges();

Есть ли что-нибудь подобное?или я должен выполнить первый запрос, несмотря ни на что?

Спасибо

Ответы [ 3 ]

2 голосов
/ 22 июня 2011

Вы, к сожалению, должны выполнить первый запрос, несмотря ни на что.

Один из вариантов - написать хранимую процедуру, которая выполняет T-SQL MERGE, а затем сопоставить ее с импортом функции, хотя для этого потребуется передать скалярные значения объекта в качестве параметров (и поддержку свойств навигации будет сделано), но это сделает то, что вы хотите.

0 голосов
/ 03 декабря 2013

Если вы просто пытаетесь ограничить код для уточнения ваших контроллеров:

db.Attach(model);
db.SaveChanges(model);

Обновится, если ключ сущности существует, и создаст, если его нет.

0 голосов
/ 22 июня 2011

Я запустил несколько быстрых тестовых кодов для редактирования в MVC 3 с EF 4, и кажется, что он работает для редактирования с помощью следующего кода:

using (var context = new TestStackOverFlowEntities())
{
    Person p = new Person();
    p.Id = long.Parse(collection["Id"]);
    p.FirstName = collection["FirstName"];
    p.LastName = collection["LastName"];
    context.People.Attach(p);
    context.ObjectStateManager.ChangeObjectState(p, System.Data.EntityState.Modified);
    context.SaveChanges();
    return RedirectToAction("Index");
}

Редактирование: я проверил создание новогообъект тоже, вам нужно изменить это

context.ObjectStateManager.ChangeObjectState(p, System.Data.EntityState.Added);

когда Id == 0 // т.е. новый объект.

Быстрый и грязный код для добавления нового:

using (var context = new TestStackOverFlowEntities())
{
    Person p = new Person();                        
    p.Id = 0;
    p.FirstName = collection["FirstName"];
    p.LastName = collection["LastName"];
    context.People.Attach(p);
    context.ObjectStateManager.ChangeObjectState(p, System.Data.EntityState.Added);
    context.SaveChanges();
    return RedirectToAction("Index");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...