gpt4 book ai didi

c# - Entity Framework - 保存父实体时未将新子实体添加到数据库(仅在生产环境中)

转载 作者:行者123 更新时间:2023-11-30 17:29:52 26 4
gpt4 key购买 nike

我在应用程序中遇到了一个奇怪的问题。我有以下代码更新父实体并添加新的子实体。

    Item item = db.Items.Find(Id);

if (newSubItems.Count() > 0)
{
newSubItems.ForEach(x =>
{
var subItem = new SubItem();
subItem.Name = x.Name;

item.SubItems.Add(subItem);
});
}

item.ModifiedAt = DateTime.Now;
item.ModifiedBy = UserId;

db.Entry(item).State = EntityState.Modified;

using (var s = db.Database.BeginTransaction(isolationLevel: IsolationLevel.RepeatableRead))
{
await db.SaveChangesAsync();
s.Commit();

logger.info("Updated successfully.");
}

此代码在我的本地环境中运行良好。如果我提供新的子项,它们会成功添加到相应的表中。

模型如下。

    public partial class Item
{
public Item()
{
this.SubItems = new HashSet<SubItem>();
}

public int Id { get; set; }
public DateTime ModifiedAt { get; set; }
public int ModifiedBy { get; set; }
public virtual ICollection<SubItem> SubItems { get; set; }
}

public partial class SubItem
{
public int Id { get; set; }
public string Name { get; set; }
public int ItemId { get; set; }
public Item Item { get; set; }
}

然而,这在我的生产环境中并没有像预期的那样工作。父实体已更新,但如果不存在子实体,则不会添加新的子实体。我检查了日志,可以看到记录了“更新成功”。如果父实体至少有 1 个子实体,则成功添加新的子实体。

因此,现在作为生产环境中的解决方法,我将在第一次保存操作后使用以下代码重新添加子项。

    int subItemsCount = db.SubItems.Where(a => a.ItemId == item.Id).Count();

if (subItemsCount == 0 && newSubItems.Count() > 0)
{
logger.info(string.Format("Sub-items are not added for Id - {0}. Adding those again.", item.Id));

newSubItems.ForEach(x =>
{
var subItem = new SubItem();
subItem.Name = x.Name;
subItem.ItemId = item.Id;

db.SubItems.Add(subItem);
});

await db.SaveChangesAsync();

logger.info(string.Format("Sub-items re-added successfully for Id - {0}.", item.Id));
}

现在查看生产环境的日志,我可以看到多次记录“Id 未添加子项”的消息,并且在第二次保存操作中成功添加了子项。

想知道是否有人知道单独在特定环境中出现这种奇怪行为的原因。

最佳答案

在您的第一种方法中,您应该检查是否 item.SubItems在执行 item.SubItems.Add() 之前为 null在上面。

如果它是 null 则初始化为 item.SubItems = new ICollection<SubItem>();

在您的第二种方法中,在此代码块中您没有分配 ItemId

 newSubItems.ForEach(x =>
{
var subItem = new SubItem();
subItem.Name = x.Name;
subItem.ItemId = item.Id;/* missing line*/
db.SubItems.Add(subItem);
});

关于c# - Entity Framework - 保存父实体时未将新子实体添加到数据库(仅在生产环境中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50622426/

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