我使用EF 4.3.1,我需要在保存时添加一个实体的默认值。
目前,我正在使用SaveChanges(),它可以正常工作。
正如您从代码中看到的,我使用ChangeTracker.Entries<Option>(),其中Option from表示特定的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:在这里使用动态数据类型有意义吗?
发布于 2012-07-04 16:39:08
我能想到三个选择:
NoteInternal属性。这很慢。dynamic尝试访问每个项目的NotIntenral属性。您必须检查并处理实体没有该属性时引发的异常。IHasNoteInternal,并让所有具有该属性的实体实现该接口。然后获取IHasNoteInternal类型的所有条目。我认为3.选项是最好的,并且提供了最好的设计,但它需要您更改可能或不可能的实体。我不知道您是否可以使用通用的Entries<TEntity>()方法来获取更改后的实体-它可能无法匹配基于接口的实体。在这种情况下,使用非通用Entries()并使用linq的OfType<T>()运算符来过滤掉相关条目。
var hasNotInternal = ChangeTracker.Entries()
.Select(e => e.Entity).OfType<IHasNotInternal>();发布于 2012-07-04 16:40:00
使您的条目继承自实现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;
} https://stackoverflow.com/questions/11325237
复制相似问题