首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖DbContext SaveChanges

覆盖DbContext SaveChanges
EN

Stack Overflow用户
提问于 2012-07-04 16:26:25
回答 2查看 2.8K关注 0票数 3

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

目前,我正在使用SaveChanges(),它可以正常工作。

正如您从代码中看到的,我使用ChangeTracker.Entries<Option>(),其中Option from表示特定的DataType。

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

代码语言:javascript
复制
      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:在这里使用动态数据类型有意义吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-04 16:39:08

我能想到三个选择:

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

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

代码语言:javascript
复制
var hasNotInternal = ChangeTracker.Entries()
                     .Select(e => e.Entity).OfType<IHasNotInternal>();
票数 4
EN

Stack Overflow用户

发布于 2012-07-04 16:40:00

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

创建扩展类

代码语言:javascript
复制
public static class DbChangeTrackerExtensions {
public static IEnumerable<T> TypedEntries<T>(this DbChangeTracker tracker) {
  return tracker.Entries().OfType<T>();
}

然后你可以在这个接口中调用它。

或者如果不可能更改实体

代码语言:javascript
复制
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;
    }  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11325237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档