Я использую 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 были установлены дата и время, когда произошло обновление - чего я не ожидал.
Кто-нибудь знает способ использования хранимых процедур для всех операций вставки, обновления и удаления, и чтобы обновления не касались связанных объектов?