3

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

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

从我使用的代码中可以看出,ChangeTracker.Entries<Option>()其中Optionrappresent 是一个特定的 DataType。

我想知道是否可能以及如何编写更通用的 ChangeTracker.Entries 版本,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 数据类型有意义吗?

4

2 回答 2

4

我可以想到三个选项:

  1. 使用反射检查每个项目是否具有NoteInternal属性。这很慢。
  2. 用于dynamic尝试访问NotIntenral每个项目的属性。当实体没有属性时,您必须检查并处理引发的异常。
  3. 创建一个定义属性的接口IHasNoteInternal,并让所有具有该属性的实体实现该接口。然后获取所有IHasNoteInternal类型的条目。

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

var hasNotInternal = ChangeTracker.Entries()
                     .Select(e => e.Entity).OfType<IHasNotInternal>();
于 2012-07-04T08:39:07.520 回答
1

使您的条目从实现 NoteInternal 属性的接口继承。

创建一个扩展类

public static class DbChangeTrackerExtensions {
public static IEnumerable<T> TypedEntries<T>(this DbChangeTracker tracker) {
  return tracker.Entries().OfType<T>();
}

然后你可以调用它传入这个接口。

或者如果无法更改实体

var name="NoteInternal";

var entities = ChangeTracker.Entries()  
                                .Where(e => e.State == EntityState.Added ||  
                                            e.State == EntityState.Modified)  
                                .Where(e => e.CurrentValues.Any(c=>c.Name==name && string.IsNullOrWhiteSpace((string)c.CurrentValue)));  
    // Add Default values when Creating or Editing an Entity  
    string defaultvalue = "";  
    foreach (var entity in entities)  
    {  
       entity.Property(name).CurrentValue=defaultvalue;
    }  
于 2012-07-04T08:40:00.417 回答