Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架5保存更改的外键新记录_Entity Framework_Entity Framework 5 - Fatal编程技术网

Entity framework 实体框架5保存更改的外键新记录

Entity framework 实体框架5保存更改的外键新记录,entity-framework,entity-framework-5,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

我正在使用.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();
我看到我找到的事件对象正在创建一个重复记录,这不是我想要的

我读过很多关于类似问题的帖子,但是外键关系中两个参与者的上下文是不同的。在这里,我使用与查找一个对象相同的上下文进行保存,而另一个对象是新的

我也试过:

currentOrder.Event.EventID = currentEvent.EventID;
但是这失败了,我得到一个EF验证错误,告诉我它需要事件对象的其他成员的值

我还尝试过在添加Order对象后但在SaveChanges之前将复制对象的EntityState设置为Distached、Modified等,但没有成功


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

在我的理解中,父对象和子对象都必须在上下文中,然后才能分配它们之间的任何关系,以使实体框架相信数据库中已经存在实体。我猜您正在尝试向数据库添加新的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(); 
}
}

根据我的理解,在分配父对象和子对象之间的任何关系之前,父对象和子对象都必须在上下文中,以使实体框架确信数据库中已经存在实体。我猜您正在尝试向数据库添加新的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(); 
}
}

好吧,我终于明白了,这是我的错

问题是Order对象被FK’d放入另一个表Shippings中,该表也被FK’d放入事件中。问题在于,是装运对象中的事件引用导致了新记录。解决方案是通过在同一上下文中添加所有关系,让EF了解这些关系


组装对象图的代码分布在许多网络表单上,这里的回答让我退了一步,批判性地看待整个问题,因此,虽然这些答案中没有一个是正确的,但我投票给所有回答的人,好的,我最终找到了答案,这是我的错

问题是Order对象被FK’d放入另一个表Shippings中,该表也被FK’d放入事件中。问题在于,是装运对象中的事件引用导致了新记录。解决方案是通过在同一上下文中添加所有关系,让EF了解这些关系


组装对象图的代码分布在许多网络表单上,这里的回答让我退一步,以批判的眼光看待整个问题,因此,虽然这些答案中没有一个是正确的,但我投票给所有回答的人

尝试调用currentOrder.Event=currentEvent;在db.Orders.AddcurrentOrder之后;谢谢你的帮忙。不幸的是,这并没有起作用。你使用的代码是正确的吗?您显示的内容无法创建新事件,因为当您加载事件时,它已附加到状态未更改的上下文中。除了在Order对象上设置属性外,调用currentOrder的代码正是此代码。Event=currentEvent;在db.Orders.AddcurrentOrder之后;谢谢你的帮忙。不幸的是,这并没有起作用。你使用的代码是正确的吗?您显示的内容无法创建新事件,因为加载事件时,它附加到状态未更改的上下文。除了在Order对象上设置属性外,它是完全相同的代码不幸的是,ILSenties没有ObjectStateManager运行幸运的是,ILSenties没有ObjectStateManager