gpt4 book ai didi

c# - ASP.NET 核心 3.1。更新集合的问题

转载 作者:行者123 更新时间:2023-12-05 06:57:47 25 4
gpt4 key购买 nike

我将 ASP.NET Core 中的应用程序从 2.1 迁移到 3.1,但 Entity Framework 出现问题。

我有一个包含 GlassesLenses 集合的实体:

public class GlassesContract : BaseUpdateEntity, IAggregateRoot
{
public Guid Id { get; private set; } = Guid.NewGuid();

private readonly List<GlassesLenses> _glassesLenses = new List<GlassesLenses>();
public ICollection<GlassesLenses> GlassesLenses => _glassesLenses.AsReadOnly().ToList();

public void ClearLenses()
{
_glassesLenses.RemoveRange(0, _glassesLenses.Count);
}

public void AddLens(GlassesLenses lens)
{
_glassesLenses.Add(lens);
}
}

以及更新镜头的服务:

public async Task<GlassesContract> ChangeSetting(GlassesContract contract)
{
// clean lenses
contract.ClearLenses();
await _glassesContractRepository.UpdateAsync(contract);

// add new lens
contract.AddLens(new GlassesLenses());

await _glassesContractRepository.UpdateAsync(contract);
return contract;
}

在 2.1 版中,该行为运行良好。集合已清除(EF 标记为删除实体),添加新镜头后 EF 标记为新实体以供插入。

在 3.1 版中,EF Core 不进行删除和插入,而只进行更新。

// delete lens
UPDATE public."GlassesContracts"
SET "AccountId" = @p0, "BalancePaymentDeposit" = @p1, ...
WHERE "Id" = @p42 AND "SysRowVer" IS NULL
RETURNING "SysRowVer";

// add new lens
UPDATE public."GlassesContracts"
SET "AccountId" = @p0, "BalancePaymentDeposit" = @p1, ...
WHERE "Id" = @p42 AND "SysRowVer" IS NULL
RETURNING "SysRowVer";

UPDATE public."GlassesLenses"
SET "Availability" = @p43, "Color" = @p44, ...
WHERE "Id" = @p77 AND "SysRowVer" IS NULL
RETURNING "SysRowVer";

映射 DbContext:

// mapping relationship
modelBuilder.Entity<GlassesContract>()
.HasMany(_ => _.GlassesLenses)
.WithOne(_ => _.GlassesContract)
.OnDelete(DeleteBehavior.Cascade);

modelBuilder.Entity<GlassesLenses>()
.HasOne(_ => _.GlassesContract)
.WithMany(_ => _.GlassesLenses);

// mapping Value objects
modelBuilder.Entity<GlassesLenses>().OwnsOne(o => o.Price).WithOwner();
modelBuilder.Entity<GlassesLenses>().OwnsOne(o => o.PriceExclVat).WithOwner();
modelBuilder.Entity<GlassesLenses>().OwnsOne(o => o.FinalPrice).WithOwner();
modelBuilder.Entity<GlassesLenses>().OwnsOne(o => o.FinalPriceExclVat).WithOwner();
modelBuilder.Entity<GlassesLenses>().OwnsOne(o => o.Discount).WithOwner();

如果我用 AddAsync(entity)Remove(entity) 标记实体,这将生成正确的 SQL 作为 INSERT 和 DELETE。

谁能解释一下为什么新版本 3.1 不如 v2.1 聪明,为什么 SysRowVer(并发 token )总是 NULL 且不更新?

非常感谢

更新

实体跟踪器在 AddLens(..) 调用后显示“实体 GlassesLens 已修改”。我不明白为什么 if 被添加为新的。

---已解决---

最佳答案

在EF数据库上下文表映射中使用

modelBuilder.Entity<GlassesContract >(m =>
{
m.OwnsMany(i => i.GlassesLenses); //instead of HasMany().WithOne()
});

有关 OwnsMany 的更多说明,请查看此 SO

关于c# - ASP.NET 核心 3.1。更新集合的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64825040/

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