簡體   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