我正在使用.NET4.5 / EF5并从现有数据库创建模型。
我正在使用以下代码:
Order currentOrder = new Order();
using (var db = new ILSEntities())
{
try
{
Event currentEvent = db.Events.OrderByDescending(u => u.EventID).FirstOrDefault();
currentOrder.Event = currentEvent;
db.Orders.Add(currentOrder);
db.SaveChanges();
而且我看到正在创建一个我找到的Event对象的重复记录,这不是我想要发生的。
我已经阅读了很多与类似问题有关的帖子,但外键关系中两个参与者的背景不同。在这里,我使用相同的上下文来保存,我用它来找到一个,而另一个对象是新的。
我也试过了:
currentOrder.Event.EventID = currentEvent.EventID;
但是失败了,因为我收到EF验证错误,告诉我它需要Event对象的其他成员的值。
在添加EntityState
对象之后Detached
之前,我还尝试专门将要复制的对象的Modified
设置为Order
,SaveChanges
等。没有成功。
我确定这是一个基本问题,但它让我感到困惑
答案 0 :(得分:2)
在我的理解中,父对象和子对象在分配它们之间的任何关系之前必须在上下文中,以说服实体框架已经在数据库中存在实体。我猜你正在尝试将新的Order对象添加到Database中,要添加新对象应该使用AddObject方法,Add()方法用于建立权限之间的关系。在您的代码中,currentOrder
不在上下文中。尝试将其挂钩在相同的上下文中,然后分配关系。您的代码应如下所示:
Order currentOrder = new Order();
using (var db = new ILSEntities())
{
try
{
Event currentEvent = db.Events.OrderByDescending(u => u.EventID).FirstOrDefault();
db.Orders.Attach(currentOrder); //attach currentOrder to context as it was not loaded from the context
currentOrder.Events.Add(currentEvent);//establish relationship
db.ObjectStateManager.ChangeObjectState(currentOrder, EntityState.Added);
db.SaveChanges();
}
}
答案 1 :(得分:2)
好吧,我最终想到这一点,这是我的错。
问题在于Order对象被FK加入到另一个表Shipments中,这些表也被FK加入事件中。问题是,Shipment对象中的Event引用导致了新记录。解决方案是让EF通过在相同的上下文中添加它们来了解这些关系。
组装对象图的代码分布在许多webforms上,这里的回复使我退后一步,批判性地看待整个事情,所以虽然这些答案中没有一个是正确的,但我投票给所有回复的人达