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

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

正如您从代码中看到的,我使用 ChangeTracker.Entries<Option>(),其中 Option rappresent 一个特定的数据类型。

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

      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 数据类型有意义吗?

最佳答案

我能想到三个选项:

  • 使用反射检查每个项目是否具有 NoteInternal 属性。这很慢。
  • 使用 dynamic 尝试访问每个项目的 NotIntenral 属性。当实体没有属性时,您必须检查并处理抛出的异常。
  • 创建一个定义属性的接口(interface) 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/

    10-13 07:49