добавление нового объекта с существующими потомками приводит к дублированию - PullRequest
0 голосов
/ 28 апреля 2011

Я использую Entity Framework 4, WCF и Silverlight.

У меня есть отношение "многие ко многим" Order to Products.

 [Order]*--*[Product]

Сначала, используя Model, Entity Framework автоматически создаетприсоединиться к столу для меня.Когда я создаю все на стороне сервера, все работает нормально.Проблема возникает при использовании Silverlight.

Я возвращаю список продуктов и отображаю их на экране.Пользователь создает новый Заказ и выбирает Продукты, которые должны быть отделены от заказа.Затем он отправляется в WCF.

var order = new order();
order.CustomerName = customerTextBox.Text;
...
order.Products = new ObservableCollection<Product>();

foreach (var product in selectedProducts)
{
   order.Products.Add(product);
}
var proxy = new OrderService();
proxy.CreateOrderAsync(order);

На стороне сервера это просто очень простой метод добавления

var db = new Model1Container();
db.Products.AddObject(order);
db.SaveChanges();

Однако происходит нечто странное.Когда это сохраняется, почти все в базе данных дублируется несколько раз.Я полагаю, что Entity Framework несколько раз пересекает циклические ссылки.

Я попытался изменить его на db.Categories.Attatch (order).Но это ни к чему не привело.Я также попытался зациклить и вручную прикрепить каждый из продуктов перед сохранением заказа.Но это приводит к возникновению исключения, в котором говорится, что объекты уже были присоединены к контексту.


Редактировать: Это останавливает дублирование продуктов.Но все Заказы в таблице все еще дублируются.Должны ли еще пересекать все отношения?

db.Orders.AddObject(order);
db.ObjectStateManager.ChangeObjectState(order, EntityState.Added);

foreach (var product in order.Products)
{
    db.ObjectStateManager.ChangeObjectState(product, EntityState.Unchanged);
}

db.SaveChanges();

Ответы [ 2 ]

1 голос
/ 28 апреля 2011

Попробуйте вместо этого:

var db = new Model1Container();
db.Categories.Attach(order);
db.ObjectStateManager.ChangeObjectState(order, EntityState.Added);
db.SaveChanges();

Проблема в том, что AddObject вставляет все неотслеживаемые объекты в граф объектов. При использовании EF вы должны явно сказать EF, что изменилось. У вас все равно будут проблемы , если вы позволите пользователям изменять свои заказы.

0 голосов
/ 28 апреля 2011

Вы используете WCF RIA?Если нет, вы должны рассмотреть это.Службы DomainServices переносят много боли.

Кроме того, почему бы вам не создать таблицу 'order_position'?Таким образом, у вас больше нет отношений между многими.Одна позиция заказа имеет только один заказ и только один продукт.Вы также можете назначить ему цену, что позволит сохранить ее для использования в статистике (что произойдет, если вы захотите узнать, сколько денег вы заработали на продукте А, но несколько раз меняли его цену в базе данных?).

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