Entity framework 实体框架5保存更改的外键新记录
我正在使用.NET4.5/EF5,并且已经从现有数据库创建了模型 我正在使用以下代码: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
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