POCO - Entity Framework - Сохранение только скалярных свойств - PullRequest
1 голос
/ 22 декабря 2010

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

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

Ответы [ 2 ]

1 голос
/ 22 декабря 2010

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

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

Шаг 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.

0 голосов
/ 22 декабря 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
...