我正在使用实体框架4,WCF和Silverlight。
我有许多订单与产品的关系。
[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();
然而奇怪的事情发生了。保存后,几乎数据库中的所有内容都会重复几次。我的猜测是因为实体框架几次遍历循环链接。
我尝试将其更改为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();
答案 0 :(得分:1)
请改为尝试:
var db = new Model1Container();
db.Categories.Attach(order);
db.ObjectStateManager.ChangeObjectState(order, EntityState.Added);
db.SaveChanges();
问题是AddObject
在对象图中插入每个未跟踪的实体。使用EF时,您必须明确说出EF已更改的内容。如果您允许用户修改订单,您仍然会have problems。
答案 1 :(得分:0)
您使用的是WCF RIA吗?如果没有,你应该考虑它。 DomainServices带来了很多痛苦。
另外,为什么不创建表'order_position'?像这样,你不再拥有多对多的关系。一个order_position只有一个订单,只有一个产品。你也可以为它分配一个价格,这使得它可以保存用于统计数据(当你想看到你对产品A赚了多少钱,但是你在数据库中改变了几次价格时会发生什么?)。