我使用EF 4.3.1我需要在保存时添加实体的默认值。
目前我正在使用SaveChanges()并且它可以正常工作。
正如您从代码中看到的,我使用ChangeTracker.Entries<Option>()
,其中Option
rappresent一个特定的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数据类型是否有意义?
答案 0 :(得分:4)
我可以想到三个选择:
NoteInternal
属性。这很慢。dynamic
尝试访问每个项目的NotIntenral
属性。当实体没有属性时,您必须检查并处理抛出的异常。IHasNoteInternal
,并让所有具有该属性的实体实现该接口。然后获取IHasNoteInternal
类型的所有条目。我认为3.选项最好并提供最佳设计,但它要求您更改可能或不可能的实体。我不知道您是否可以使用通用Entries<TEntity>()
方法来获取已更改的实体 - 它可能无法与基于接口的实体匹配。在这种情况下,请使用非通用Entries()
并使用linq的OfType<T>()
运算符过滤掉相关条目。
var hasNotInternal = ChangeTracker.Entries()
.Select(e => e.Entity).OfType<IHasNotInternal>();
答案 1 :(得分: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;
}