MERGE в Entity Framework

Есть ли способ вызвать команду T-Sql MERGE из .NET Entity каркас 4?


person alerya    schedule 30.04.2011    source источник


Ответы (1)


Нет такой встроенной функциональности - вы должны создать свою собственную. Очень распространенным является, например, такой подход:

public void SaveOrUpdate(MyEntity entity)
{
    if (entity.Id == 0)
    {
        context.MyEntities.AddObject(entity);
    }
    else
    {
        context.MyEntities.Attach(entity);
        context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
    }

    // You can call SaveChanges here or you can call it separately after multiple changes
}

Это пример работы с отдельным объектом, который Id автоматически генерируется в базе данных (IDENTITY). Идентификатор по умолчанию для нового объекта всегда равен 0, поскольку при сохранении изменений будет присвоено реальное значение.

person Ladislav Mrnka    schedule 30.04.2011
comment
спасибо, однако. При использовании DDD и присоединении корня Aggregate с несколькими уровнями вложенности свойств потребуется выполнить некоторую форму или рекурсию. Есть ли какой-то пример этого? (Также немного озадачивает то, что команда EF ожидает, что разработчики сами справятся с этим распространенным сценарием, когда другие формы, такие как NHibernate, предлагают слияние из коробки) - person Mickey Puri; 25.04.2014
comment
Но что, если вы еще не знаете, существует ли объект в базе данных? Оператор MERGE предназначен именно для определения того, существует объект или нет, а также для обновления или вставки при необходимости. - person Joshua Frank; 17.11.2014
comment
Вы пропустите часть удаления. - person Azimuth; 16.05.2017
comment
@JoshuaFrank Вот для чего предназначен if (entity.Id == 0); предположительно в базе данных идентификатор начинается с 1. - person Tom Blodget; 24.08.2019