繁体   English   中英

如果实体中的字符串为null,则在SQL中使用默认值

[英]Use default value in SQL if string in entity is null

我有一个使用数据库优先方法和SQL Server数据库的项目。

在表之一中,我有一个不可为空的列,其默认值为空字符串:

[Comments] NVARCHAR(1024) NOT NULL DEFAULT ('')

这里的默认值应该始终是一个空字符串,以完全支持odata“ Is not empty”过滤器,否则将返回具有空值的记录,这些记录从业务角度来看实际上是空的。

在我的模型中,此列也有一个字符串属性:

public string Comments { get; set; }

现在发生的事情是:如果适当的输入未填充数据,从前端我可能会得到空值,并且该值将映射到实体中,然后由EF插入该实体。

如果我只是尝试设置具有空的“ Comments”属性的记录,而不是在SQL端获取默认值,那我将获得异常。

我试图通过将此列的StoreGeneratedPattern设置为EDMX中的Computed来修复它。 现在,我可以插入带有空值的记录,我将获得默认值,但是即使实体中具有值,我也会每次都获得它。

换句话说,计算出的StoreGeneratedPattern始终会忽略实体中此属性的值,并且禁用StoreGeneratedPattern基本上在SQL端没有默认值。

我想要以某种不错的方式在后端解决此问题。

  1. 我不想仅通过始终从前端发送空字符串并将验证添加到后端来解决此属性永远不会为null的问题。 这将迫使我对其他客户端(例如移动客户端)以及遇到相同情况的每个表格和表格执行相同的操作。

  2. 我不想通过做类似的事情来解决它:

     entity.Comments = entity.Comments ?? string.empty; 

    在后端。 这将迫使我在我处理此实体和其他类似实体的每个地方都这样做。

  3. 我不想通过对相似实体使用某些接口或在构造函数中初始化此属性来解决此问题。 我有一个单一的T4模板,出于去耦的原因,该模板可以从EDMX为我构建实体模型,因此所有模型都是自动生成的,永远不要定制。

我期望并希望达到的行为如下:

如果EF尝试为此列插入具有空值的记录,则SQL Server使用DEFAULT,否则将插入实体所具有的内容。

任何想法或解决方案将不胜感激。

我在CRUD函数中有一个用于此类任务的通用函数

private T SetNullStringToDefault<T>(T entity, string default)
{
    List<PropertyInfo> properties = entity.GetType().GetProperties().ToList();
    foreach(var property in properties)
    {
        //if property is string
        if(property.PropertyType == typeof(string))
        {
            string value = property.GetValue(entity, null) as string;
            if (string.IsNullOrEmpty(value))
                property.SetValue(entity, default, null);
        }
    }
    return entity;
}

然后在插入之前先调用它

your_object = SetNullStringToDefault<EntityType>(your_object, "Default Value");

只要将其传递给您的对象,它将所有NULL字符串属性转换为默认值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM