gpt4 book ai didi

c# - Entity Framework 不保存修改后的 child

转载 作者:IT王子 更新时间:2023-10-29 04:24:26 26 4
gpt4 key购买 nike

令人沮丧,这个。这是由数据库优先 Entity Framework 生成的一对相关对象:

public partial class DevelopmentType
{
public DevelopmentType()
{
this.DefaultCharges = new HashSet<DefaultCharge>();
}

public System.Guid RowId { get; set; }
public string Type { get; set; }

public virtual ICollection<DefaultCharge> DefaultCharges { get; set; }
}

public partial class DefaultCharge
{
public System.Guid RowId { get; set; }
public decimal ChargeableRate { get; set; }
public Nullable<System.Guid> DevelopmentType_RowId { get; set; }

public virtual DevelopmentType DevelopmentType { get; set; }
}

这是我调用以保存 DevelopmentType 的代码 - 它涉及自动映射器,因为我们将实体对象与 DTO 区分开来:

    public void SaveDevelopmentType(DevelopmentType_dto dt)
{
Entities.DevelopmentType mappedDevType = Mapper.Map<DevelopmentType_dto, Entities.DevelopmentType>(dt);
_Context.Entry(mappedDevType).State = System.Data.EntityState.Modified;

_Context.DevelopmentTypes.Attach(mappedDevType);
_Context.SaveChanges();
}

在我的用户界面中,最常见的操作是让用户查看 DevelopmentType 列表并更新其 DefaultCharge。所以当我使用上面的代码测试它时,它运行没有错误,但实际上没有任何变化。

如果我在调试器中暂停,很明显已将更改的 DefaultCharge 传递到函数中,并且它已附加到要保存的 DevelopmentType。

单步执行,如果我在 visual studio 中手动更改值,它保存更新后的值。这更令人困惑。

使用 SQL Server Profiler 监视数据库显示更新命令针对父对象而针对任何附加对象。

我在其他地方有其他类似的代码可以按预期运行。我在这里做错了什么?

编辑:

我发现,如果您在调用 SaveDevelopmentType 之前执行此操作:

        using (TransactionScope scope = new TransactionScope())
{
dt.Type = "Test1";
dt.DefaultCharges.First().ChargeableRate = 99;
_CILRepository.SaveDevelopmentType(dt);
scope.Complete();
}

对 Type 的更改会保存,但对 ChargeableRate 的更改不会。我不认为它有很大帮助,但我想我会添加它。

最佳答案

问题是,EF 不知道已更改的 DefaultCharges。

通过将 DevelopmentType 的状态设置为 EntityState.Modified,EF 只知道对象 DevelopmentType 已更改。但是,这意味着 EF 只会更新 DevelopmentType 而不会更新它的导航属性。

解决方法(这不是最佳做法)是遍历当前 DevelopmentType 的所有 DefaultCharge 并将实体状态设置为 EntityState.Modified

此外,我建议先将实体附加到上下文,然后再更改状态。

评论后编辑

当您使用 DTO 时,我想您正在通过不同的层或不同的机器传输这些对象。

在这种情况下,我建议使用 self 跟踪实体,因为不可能共享一个上下文。这些实体还拥有它们的当前状态(即新的、更新的、删除的等)。网上有很多关于自跟踪实体的教程。

例如MSDN - Working with Self-Tracking Entities

关于c# - Entity Framework 不保存修改后的 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18054798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com