Я использую 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();
Обновляемый Адрес связан с Человеком, я - retrieveing - хотя они явно не связаны всегда в коде. Когда контекст. SaveChanges () выполняется не, только делает Обновление sproc для моего объекта Адреса, запущены (как Вы, ожидал бы), но также - Обновление sproc для объекта Человека - даже при том, что Вы видите, что не было никакого изменения, внесенного в объект Человека.
Когда я проверяю EntityState обоих объектов перед контекстом. SaveChanges () звонят, я вижу, что мой объект Адреса имеет EntityState "Modified", и моя Личность enity имеет EntityState "Неизменных".
Почему Обновление sproc называемый для объекта Человека? Существует ли какая-то установка, которую я могу установить для предотвращения этого?
Я создал второй проект удостовериться, что проблемы не происходило из-за чего-то в моей текущей среде проекта.
Во-первых, я создал новую базу данных, которая содержит таблицу Order и OrderDetail. У них есть внешний ключ между ними так, чтобы Порядок мог иметь больше чем один OrderDetail, связанный с ним. Я также создал "после того, как Обновление" DB включает таблицы 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();
}
}
Я запустил программу, не делая никакой функции, отображающейся для моих объектов Порядка и OrderDetail. Результат был точно, что я буду ожидать видеть, запись OrderDetail обновляется, чтобы иметь Количество 7, и поле UpdateDateTime заполняется с датой и временем, обновление произошло. Никакие изменения в моем запись Порядка, что не означает обновления, не произошли.
Я затем создаю хранимые процедуры для обработки обновления таблиц Order и OrderDetail в DB. Они не делают ничего специального, просто принимают параметры для каждого столбца в таблице и затем устанавливают каждое поле, равное связанному параметру. Я затем отобразил те хранимые процедуры на свои Объекты модели с помощью Отображающихся Деталей (Объект карты к Функциям) окно.
После выполнения отображения я запустил программу. В результате я наблюдал ожидаемое поведение наблюдения обновлений таблицы OrderDetail, но кроме того таблица Order "после Обновления" триггер стреляла, и поле UdateDateTime было установлено на дату и время, обновление произошло - который я не буду ожидать.
Кто-либо знает о способе использовать хранимые процедуры для всех, Вставляют, Обновление и Удаляют операции и не имеют каскад обновлений до связанных объектов?