2

我正在使用 .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,但之前没有成功。ModifiedOrderSaveChanges

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

4

2 回答 2

2

在我的理解中,父对象和子对象都必须在上下文中,然后才能分配它们之间的任何关系以使实体框架相信数据库中已经存在实体。我猜您正在尝试将新的 Order 对象添加到数据库中,要添加新对象,您应该使用 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(); 
}
}
于 2012-09-23T23:45:00.363 回答
2

好吧,我最终解决了这个问题,这是我的错。

问题是 Order 对象被 FK 插入到另一个表 Shipments 中,该表也被 FK 插入到 Events 中。问题在于 Shipment 对象中的 Event 引用导致了新记录。解决方案是通过将它们全部添加到同一上下文中来让 EF 了解这些关系。

组装对象图的代码分布在许多网络表单上,这里的响应让我退后一步,批判性地看待整个事情,所以虽然这些答案没有一个是正确的,但我投票给所有回答的人

于 2012-09-24T06:56:27.323 回答