实体框架核心2-在数据库中将空字符串另存为null

时间:2018-07-18 11:40:21

标签: entity-framework entity-framework-core interceptor

我在应用程序中使用实体框架核心2。 我的数据库上下文中有很多可以空的字符串列。 问题是我想将空字符串保存为db中的null。 在Ef的旧版本中,我使用IDbCommandInterceptor来实现拦截器,但在Ef核心2中,我不知道如何编写一个?

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),就可以了,但是可以保证所有代码都以此方式测试字符串。