实体框架更新一条记录删除另一条记录



我正在修改一个业务应用程序,以引入一个新的实体SalesOrderReason。这将绑定到基于SalesOrderReasonID字段的另一个实体SalesOrder。

我希望这段代码所做的是设置销售订单的SalesOrderReasonID(从按钮按下调用-这是一个桌面应用程序)。

实际上,它第一次运行的时候,它设置了SalesOrderReasonID——这很好。当我为下一个SalesOrder设置SalesOrderReasonID时,它正确地设置了它,但是它从数据库中删除了之前的SalesOrder,这显然是不需要的行为。

我以前也遇到过类似的问题,其中关系配置不正确(我使用WithOne而不是WithMany),导致了相同的症状,因此我认为这与配置有关。

我也试过从另一个角度配置它(SalesOrderReason配置),但没有成功。(这里是这个尝试,我在SalesOrderReason上创建了一个ICollection SalesOrdersWithReason)

builder.HasMany(e => e.SalesOrdersWithReason)
.WithOne(s => s.SalesOrderReason)
.HasForeignKey(s => s.SalesOrderReasonID);

(对不起,如果这是太多的代码,我已经试图剥离我认为不相关的。)

这是SalesOrder实体。

public class SalesOrder
{
public int ID { get; set; }
public int SalesOrderReasonID { get; set; }
public SalesOrderReason SalesOrderReason { get; set; }
}

这是SalesOrderReason实体

public class SalesOrderReason
{
public int Id { get; set; }
public string Reason { get; set; }
public DateTime DateCreated { get; set; }
}

这是我使用fluent API的配置

public class SalesOrderConfiguration : IEntityTypeConfiguration<SalesOrder>
{
public void Configure(EntityTypeBuilder<SalesOrder> builder)
{

builder.HasKey(e => e.ID);
builder.Property(e => e.ID)
.ValueGeneratedOnAdd();
builder.HasOne(s => s.SalesOrderReason)
.WithMany()
.HasForeignKey(s => s.SalesOrderReasonID);
}
}

这是我的Repository中的Save方法

public void Save() => _context.SaveChanges();

当保存对SalesOrderReasonID的更改时,这里就会出错

private static void ChangeSalesOrderReason(SalesOrder salesOrder, int salesOrderReasonID)
{
salesOrder.SalesOrderReasonID = salesOrderReasonID;
SalesOrderRepository.Save();
}

编辑包含UI代码的请求这个用例中的SalesOrder是一个来自Telerik gridview行的现有对象,它被选中,然后用户按下按钮将SalesOrder上的SalesOrderReason更新为DropDownList中的SalesOrderReason。

UI是用VB编写的。. Net(我知道很奇怪,但这是我们正在重建的遗留项目的一部分)上述c#代码是在单独的c#项目中添加的,作为VB项目的参考。
Private Sub UpdateReasonButton_Click(sender As Object, e As EventArgs) Handles UpdateReasonButton.Click
For Each salesOrderRow As GridViewRowInfo In SalesOrderGridView.SelectedRows
SalesOrderController.ChangeSalesOrderReason(salesOrderRow.DataBoundItem, ReasonList.SelectedValue)
Next
End Sub

在Panagiotis Kanavos的评论之后,我调整了我的DbContext以使其具有更短的生命周期,我没有时间创建一个适当的"工作单元";模式,但只要在我的代码碰到存储库时重新创建上下文似乎就可以了。

最新更新