POCO — Entity Framework — сохранение только скалярных свойств

Это может быть немного странно, но я хочу сохранить в базе данных только скалярные свойства объекта. например. скажем, у меня есть 2 таблицы/объекта «Пользователь» и «Пользовательский порядок». Сущность «Пользователь» имеет «Имя», «Фамилия», «UserOrders» (набор «UserOrder»). Теперь я получаю объект «Пользователь», в котором есть несколько пользовательских заказов. Мне нужно сохранить только скалярные свойства "Пользователя", т.е. Имя и Фамилия.

Если я делаю context.Users.AddObject(user), он также добавляет «UserOrders» в БД (чего я не хочу). Является ли создание нового объекта «Пользователь» и копирование всех скаляров в него единственным вариантом (или) можем ли мы явно указать EF сохранять только скаляры, даже если в нем есть другие навигационные свойства?

Причина, по которой я спрашиваю, заключается в том, что я должен сохранять «Пользователь» и «Пользовательские заказы» отдельно в два разных этапа.


person Jonna    schedule 21.12.2010    source источник


Ответы (2)


Очень странно - я уверен, что у вас есть свои причины для этого.

Вы можете удалить навигационные свойства (например, нескалярные) из модели, чтобы сохранить два объекта по отдельности.

Шаг 1. Добавление пользователя.

var user = new User { };
user.UserOrders = new UserOrders { }; // compiler error! no property exists. good!
ctx.Users.AddObject(user); // only user scalar properties added

Шаг 2. Добавление UserOrder, который по-прежнему должен быть связан с пользователем:

var relatedUser = ctx.Users.First(); // grab the user related to this order
var userOrder = new UserOrder { UserId = relatedUser.UserId }; // explicitly set the FK
ctx.UserOrders.AddObject(userOrder); // UserOrder added with appropriate FK

Это должно работать — я еще не пробовал, но попробуйте.

Имейте в виду, что недостатком этого подхода является то, что вы не сможете активную/ленивую загрузку UserOrders при запросе User — вам придется вручную присоединиться к FK с помощью LINQ.

person RPM1984    schedule 21.12.2010

Можете ли вы объяснить, почему вам нужно сделать это в 2 отдельных шага? В любом случае, если у вас есть ограниченное количество навигационных свойств, вы можете просто сохранить в другой переменной и удалить:

var orders = user.Orders;
user.Orders = null;
context.Users.AddObject(user);

...

context.Orders.AddObject(orders); // You might have to do these one by one
person Nelson Rothermel    schedule 21.12.2010
comment
Спасибо за ответ. Собственно, User и UserOrders были просто примером. У нас есть сложная система, в которой требуется хранение в 2 этапа, потому что в промежутке между ними требуется дополнительная проверка. Поскольку навигационных свойств больше, чем скалярных, и поскольку я снова буду использовать в коде так называемый объект User, я думаю, что лучше создать новый объект, чем хранить ссылки на свойства навигации. Можем ли мы явно указать в EF для хранения только скаляров (как это делает ApplyCurrentValues ​​при обновлении)? - person Jonna; 22.12.2010
comment
@Jonna: я не знаком ни с чем подобным, хотя это могло бы существовать. - person Nelson Rothermel; 22.12.2010