Entity Framework 4 Entity с EntityState без изменений обновления - PullRequest
6 голосов
/ 28 мая 2010

Я использую EF 4, отображая все операции CUD для моих сущностей, используя sprocs.

У меня есть две таблицы: АДРЕС и ЧЕЛОВЕК. У ЛИЦА может быть несколько АДРЕС, связанных с ними.

Вот код, который я использую:

Person person = (from p in context.People
                             where p.PersonUID == 1
                             select p).FirstOrDefault();

Address address = (from a in context.Addresses
                               where a.AddressUID == 51
                               select a).FirstOrDefault();

address.AddressLn2 = "Test";

context.SaveChanges();

Обновляемый адрес связан с человеком, которого я получаю, хотя они явно не связаны каким-либо образом в коде. Когда context.SaveChanges () выполняется, не только запускается Sproc обновления для моего объекта Address (как и следовало ожидать), но и Sproc Update для лица Person - даже если вы видите, что в Лицо сущность.

Когда я проверяю EntityState обоих объектов перед вызовом context.SaveChanges (), я вижу, что моя сущность Address имеет EntityState "Modified", а моя сущность Person имеет EntityState "Unoted".

Почему для объекта Person вызывается Sproc Update? Есть ли какая-то настройка, которую я могу установить, чтобы предотвратить это?


Я создал второй проект, чтобы убедиться, что проблема не возникает из-за чего-то в моей текущей проектной среде.

Сначала я создал новую базу данных, которая содержит таблицы Order и OrderDetail. Между ними есть внешний ключ, поэтому с ним может быть связано более одного OrderDetail. Я также создал триггеры БД «после обновления» для таблиц Order и OrderDetail, которые обновляют поле DateTime при обновлении записи.

Во-вторых, я создал простое приложение WPF и создал объектную модель ADO.NET, сгенерированную из моей базы данных.

В-третьих, я добавил код в свой конструктор класса следующим образом:

public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();

      MyEntities context = new MyEntities();

      Order order = (from o in context.Orders
              select o).FirstOrDefault();

      OrderDetail orderDetail = (from d in order.OrderDetails
                    select d).FirstOrDefault();

      orderDetail.Qty = 7;

      context.SaveChanges();
    }
  }

Я запустил программу без сопоставления функций для моих объектов Order и OrderDetail. Результатом было именно то, что я ожидал увидеть, запись OrderDetail обновлена, чтобы иметь кол-во 7, а поле UpdateDateTime заполнено датой и временем, когда произошло обновление. Нет изменений в моей записи заказа, что означает, что обновление не произошло.

Затем я создаю хранимые процедуры для обработки обновления таблиц Order и OrderDetail в БД. Они не делают ничего особенного, просто принимают параметры для каждого столбца в таблице, а затем устанавливают каждое поле равным соответствующему параметру. Затем я сопоставил эти хранимые процедуры с моими объектами Model, используя окно «Сведения о сопоставлении (сопоставление сущности с функциями)».

После сопоставления я запустил программу. В результате я наблюдал ожидаемое поведение при просмотре обновлений таблицы OrderDetail, но, кроме того, сработал триггер таблицы «после обновления», и в поле UdateDateTime были установлены дата и время, когда произошло обновление - чего я не ожидал.

Кто-нибудь знает способ использования хранимых процедур для всех операций вставки, обновления и удаления, и чтобы обновления не касались связанных объектов?

1 Ответ

4 голосов
/ 26 января 2011

У меня была такая же проблема, и она была решена исправлением, упомянутым на на странице MS KBD .

Исправление было широко опубликовано только в .NET 4.5. Тем не менее, я ожидаю, что EF 6 (который работает как на .NET 4 / .NET 4.5) также будет поставлять это исправление, поскольку он заменяет версию System.Data.Entity.dll, поставляемую с .NET 4, с собственной.

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