实体框架5关于SaveChanges的外键新记录

时间:2012-09-23 16:18:58

标签: entity-framework entity-framework-5

我正在使用.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设置为OrderSaveChanges等。没有成功。

我确定这是一个基本问题,但它让我感到困惑

2 个答案:

答案 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上,这里的回复使我退后一步,批判性地看待整个事情,所以虽然这些答案中没有一个是正确的,但我投票给所有回复的人达

相关问题