Я использую 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();