如何在 EF Core 相关集合中的 属性 上将 IsModified 设置为 false?
How to set IsModified to false on a property in a related Collection in EF Core?
我正在使用 Asp.Net Core 1.1,我有两个 类:
public class Scale
{
[Key]
public int ScaleId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal DefaultValue { get; set; }
public List<ScaleLabel> Labels { get; set; }
}
public class ScaleLabel
{
[Key]
public int ScaleLabelId { get; set; }
public int ScaleId { get; set; }
public virtual Scale Scale { get; set; }
public decimal Value { get; set; }
public string Label { get; set; }
}
当一个scale被使用时,除了它们的Label 属性.
之外,它的所有ScaleLabels应该被禁止更新
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("ScaleId,Name,Description,DefaultValue,Labels")] Scale scale)
{
if (id != scale.ScaleId)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
if (IsScaleUsed(id))
{
_context.Scales.Attach(scale);
_context.Entry(scale).Collection(c => c.Labels).IsModified = false;
}
else
{
_context.Update(scale);
}
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!ScaleExists(scale.ScaleId))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction("Index");
}
return View(scale);
}
如果我使用 _context.Entry(scale).Collection(c => c.Labels).IsModified = false;
则不会更新任何内容,如果我不使用它,则会更新所有 ScaleLabel。我想指定 Scale 的标签导航 属性 的哪些属性被修改,哪些没有被修改。
与其玩 IsModified
属性 的相关 CollectionEntry
,不如使用 PropertyEntry
的 IsModified
属性由 EntityEntry
的 Property
方法(或 Properties
属性)为相关集合的每个元素返回(基本上与针对特定 属性 的方法相同)任何实体)。
换句话说,而不是
_context.Entry(scale).Collection(c => c.Labels).IsModified = false;
你会使用这样的东西:
foreach (var label in scale.Labels)
foreach (var p in _context.Entry(label).Properties.Where(p => p.Metadata.Name != "Label"))
p.IsModified = false;
我正在使用 Asp.Net Core 1.1,我有两个 类:
public class Scale
{
[Key]
public int ScaleId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal DefaultValue { get; set; }
public List<ScaleLabel> Labels { get; set; }
}
public class ScaleLabel
{
[Key]
public int ScaleLabelId { get; set; }
public int ScaleId { get; set; }
public virtual Scale Scale { get; set; }
public decimal Value { get; set; }
public string Label { get; set; }
}
当一个scale被使用时,除了它们的Label 属性.
之外,它的所有ScaleLabels应该被禁止更新 [HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("ScaleId,Name,Description,DefaultValue,Labels")] Scale scale)
{
if (id != scale.ScaleId)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
if (IsScaleUsed(id))
{
_context.Scales.Attach(scale);
_context.Entry(scale).Collection(c => c.Labels).IsModified = false;
}
else
{
_context.Update(scale);
}
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!ScaleExists(scale.ScaleId))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction("Index");
}
return View(scale);
}
如果我使用 _context.Entry(scale).Collection(c => c.Labels).IsModified = false;
则不会更新任何内容,如果我不使用它,则会更新所有 ScaleLabel。我想指定 Scale 的标签导航 属性 的哪些属性被修改,哪些没有被修改。
与其玩 IsModified
属性 的相关 CollectionEntry
,不如使用 PropertyEntry
的 IsModified
属性由 EntityEntry
的 Property
方法(或 Properties
属性)为相关集合的每个元素返回(基本上与针对特定 属性 的方法相同)任何实体)。
换句话说,而不是
_context.Entry(scale).Collection(c => c.Labels).IsModified = false;
你会使用这样的东西:
foreach (var label in scale.Labels)
foreach (var p in _context.Entry(label).Properties.Where(p => p.Metadata.Name != "Label"))
p.IsModified = false;