我在应用程序中使用实体框架核心2。 我的数据库上下文中有很多可以空的字符串列。 问题是我想将空字符串保存为db中的null。 在Ef的旧版本中,我使用IDbCommandInterceptor来实现拦截器,但在Ef核心2中,我不知道如何编写一个?
答案 0 :(得分:2)
应该有一个新的IDbCommandInterceptor
接口,但是看起来很复杂。
一种简单的方法是编写一个函数以删除空字符串,然后在将数据保存到DbContext
类中之前调用它。
public void RemoveEmptyStrings()
{
// Look for changes
this.ChangeTracker.DetectChanges();
// Loop through each entity
foreach (var entity in this.ChangeTracker.Entries())
{
// Use reflection to find editable string properties
var properties = from p in entity.Entity.GetType().GetProperties()
where p.PropertyType == typeof(string)
&& p.CanRead
&& p.CanWrite
select p;
// Loop through each property and replace empty strings with null
foreach (var property in properties)
{
if (string.IsNullOrWhiteSpace(property.GetValue(entity.Entity, null) as string))
property.SetValue(entity.Entity, null, null);
}
}
}
请记住要覆盖SaveChanges()
类中的SaveChanges(bool)
,SaveChangesAsync()
,DbContext
的每个版本。
public override int SaveChanges()
{
// Replace empty strings with null
this.RemoveEmptyStrings();
// Continue with base functionality
return base.SaveChanges();
}
答案 1 :(得分:0)
请谨慎在数据库中存储与域对象中不同的值。从数据库中合并后,任何与该对象相关的代码的行为都会有所不同。
如果您始终使用String.IsNullOrEmpty(val),就可以了,但是可以保证所有代码都以此方式测试字符串。