gpt4 book ai didi

c# - EntityFramework 更新在 SaveChanges/ASP.NET MVC/postbacks 上随机失败

转载 作者:太空狗 更新时间:2023-10-29 20:38:06 25 4
gpt4 key购买 nike

我正在从 MVC 中的回传进行实体更新:

ControlChartPeriod period = _controlChartPeriodService.Get(request.PeriodId);

if (period != null)
{
SerializableStringDictionary dict = new SerializableStringDictionary();

dict.Add("lambda", request.Lambda.ToString());
dict.Add("h", request.h.ToString());
dict.Add("k", request.k.ToString());

period.Parameters = dict.ToXmlString();

// ToDo : fails on save every now and then when one of the values changes; fails on Foreign Key being null
try
{
_controlChartPeriodService.Update(period, request.PeriodId);
return Ok(request);
}

更新方法如下所示:

public TObject Update(TObject updated, TKey key)
{
if (updated == null)
return null;

TObject existing = _context.Set<TObject>().Find(key);
if (existing != null)
{
_context.Entry(existing).CurrentValues.SetValues(updated);
_context.SaveChanges();
}
return existing;
}

public TObject Get(TKey id)
{
return _context.Set<TObject>().Find(id);
}

奇怪的是我第一次运行它时通常运行良好;如果我进行第二次回发,则它不起作用并且因外键的 EntityValidation 错误而失败;但是检查外键的实体看起来很好并且没有受到影响。

我是否需要以某种方式在某处同步 Context?

我一直在尝试找出它何时成功或何时不成功的差异。

我正在为存储库使用注入(inject):

public void ConfigureServices(IServiceCollection services)
{
services.AddScoped((_) => new DataContext(ConfigSettings.Database.ConnectionString));
services.AddScoped<ControlChartPeriodService, ControlChartPeriodService>();
}

-- 更新:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public DateTime StartDate { get; set; }
public DateTime? EndDate { get; set; }
public virtual ICollection<ControlChartPoint> ControlChartPoints { get; set; }

[Required]
public virtual ControlChart ControlChart { get; set; }
public string Parameters { get; set; }

在 ControlChartMap 中,我们有以下内容:

HasMany(x => x.Periods)
.WithRequired(c => c.ControlChart);

最佳答案

如果您期望 TObject 的加载也包括关系,在我看来您的问题出在这一行:

TObject existing = _context.Set<TObject>().Find(key);

Find 将只加载 TObject 记录而不是它的关系,因为代码中没有对 ControlChart 属性它不会延迟加载 - 这似乎是您所期望的行为,所以我假设您启用了延迟加载

事实关系已经配置为

HasMany(x => x.Periods).WithRequired(c => c.ControlChart);

表示 TObjectControlChart 属性是一组相关的Periods 但这并不意味着它会强制加载 TObject 时关系的延迟加载。

(我个人尽量避免因为这样的事情而依赖延迟加载,并且更喜欢实际禁用它并通过 Include 急切地加载关系,或者以较少的方式加载关系,显式加载,通过使用 Load。这可能是个人喜好问题,但我发现这种方式可以让您免于许多麻烦)

因此,如果您启用了延迟加载并且喜欢它的工作方式,请在加载和保存之前的任何时间点引用 ControlChart 属性,例如

var chart= existing.ControlChart;

或类似的东西

或者对于非懒加载的场景,虽然在任何情况下都可以使用:

 TObject existing = _context.Set<TObject>().Where(x=>x.Id==key).Include(x=> x.ControlChart).FirstOrDefault();

关于c# - EntityFramework 更新在 SaveChanges/ASP.NET MVC/postbacks 上随机失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58112636/

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