gpt4 book ai didi

c# - 覆盖 DbContext SaveChanges

转载 作者:行者123 更新时间:2023-11-30 15:03:38 25 4
gpt4 key购买 nike

我使用 EF 4.3.1 我需要在保存时添加一个实体的默认值。

目前我正在使用 SaveChanges() 并且它有效。

从我使用的代码可以看出 ChangeTracker.Entries<Option>()其中 Option表示一个特定的数据类型。

我想知道是否可能以及如何编写一个更通用的 ChangeTracker 版本。类似 ChangeTracker.Entries<t>() 的条目因此它可以检查我的模型中所有类型的实体,正如您在我的特定案例中看到的那样,我在许多类上都有一个 NoteInternal 属性

      public override int SaveChanges()
{
#region Option BL
var entities = ChangeTracker.Entries<Option>()
.Where(e => e.State == EntityState.Added ||
e.State == EntityState.Modified)
.Select(e => e.Entity);
// Add Default values when Creating or Editing an Entity
string defaultvalue = "";
foreach (var entity in entities)
{
if (String.IsNullOrWhiteSpace(entity.NoteInternal))
entity.NoteInternal = defaultvalue;
}
#endregion

return base.SaveChanges();
}

感谢您的帮助!

PS:在这里使用 DYNAMIC 数据类型有意义吗?

最佳答案

我可以想到三个选项:

  1. 使用反射检查每个项目是否有 NoteInternal属性(property)。这很慢。
  2. 使用dynamic尝试访问 NotIntenral每个项目的属性。您必须检查并处理实体不具有该属性时抛出的异常。
  3. 制作界面IHasNoteInternal定义属性并让所有具有该属性的实体实现该接口(interface)。然后获取 IHasNoteInternal 的所有条目类型。

我认为 3. 选项是最好的并且提供了最好的设计,但它需要您更改可能或不可能的实体。我不知道你是否可以使用通用 Entries<TEntity>()方法来获取更改的实体 - 它可能无法匹配基于接口(interface)的实体。在这种情况下,使用非通用 Entries()并使用 linq 的 OfType<T>()运算符过滤掉相关条目。

var hasNotInternal = ChangeTracker.Entries()
.Select(e => e.Entity).OfType<IHasNotInternal>();

关于c# - 覆盖 DbContext SaveChanges,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11325237/

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