簡體   English   中英

保存更改時如何將空字符串保存為string.empty?

[英]How to save null strings as string.empty when saving changes?

假設我有一個這樣的類(為簡潔起見,省略了詳細信息):

public class Address
{
    public Address()
    {
        PostalCode = "";
    }
    public string PostalCode { get; set; } 
}

在映射中,郵政編碼被標記為必需:

public AddressMap()
{
    this.Property(t => t.PostalCode)
        .HasColumnName("PostalCode")
        .IsRequired()
        .HasMaxLength(50);
}

在數據庫中,它定義如下:

CREATE TABLE [dbo].[Address] (
  [PostalCode]   VARCHAR (50)   NOT NULL   DEFAULT ((''))
);

它在代碼中初始化為PostalCode的空值:

string pc = null;
var address = New Address()
{ 
    PostalCode = pc 
};

當我將該地址添加到dbContext並保存更改時,我得到一個DbEntityValidationException因為我正在嘗試為NOT NULL列保存空值。

有沒有辦法讓實體框架或數據庫不嘗試將.IsRequired字符串列保存為null ,而是將其保存為空字符串?

一種選擇是更改屬性的get訪問器以刪除空值:

public class Address
{
    private string _postalCode;

    public Address()
    {
        PostalCode = "";
    }

    public string PostalCode 
    { 
        get
        {
            //This will never return a null
            return _postalCode ?? "";
        }
        set
        {
            _postalCode = value;
        } 
    }
}

您始終可以循環遍歷類的不同部分,並使用System.Reflection執行nullCheck。 下面是一些將泛型類列表傳遞給datatable和datatableRow的示例。 您可以使用與GetProperties相同的想法進行空檢查,以及將您的類轉換為SQL插入,CSV數據,XML或您需要的任何內容。

public static DataTable create_DataTable_From_Generic_Class(Type t)
    {
        DataTable d = new DataTable();
        FieldInfo[] fI = t.GetFields();
        for(int i = 0; i < fI.Length; i++)
        {
            DataColumn dC = new DataColumn(fI[i].Name, fI[i].FieldType);
            d.Columns.Add(dC);
        }
        return d;
    }
    public static object[] Create_Datatable_Row_From_Generic_Class(Type t, object instance,DataTable dt)
    {

        FieldInfo[] f = t.GetFields();
        object[] ret = new object[f.Length];
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            ret[i] = t.GetField(dt.Columns[i].ColumnName).GetValue(instance);
            if (ret[i] == null)
            {
                ret[i] = "null";
            }
        }
        return ret;

    }

出於某種原因, 答案對我沒有用。 很可能是因為一些EF底層設置 但是,在[Required]上添加AllowEmptyStrings = true ,即

[Required(AllowEmptyStrings = true)]

解決了這個問題。

PS我在字符串屬性上有[Required] ,與問題相比,這是微小的差異。

為什么要將String初始化為null? 可能是你使用:

string pc = String.Empty;

var address = New Address() {    PostalCode = pc  };

如果你想確保永遠不為null你可以使用@DavidG的解決方案但是如果你想檢查何時為null可能你需要初始化為String.Empty

也許在調用SaveChanges()之前在上下文類中設置Configuration.ValidateOnSaveEnabled = false將起作用。

context.Configuration.ValidateOnSaveEnabled = false;
context.SaveChanges();

實體框架/ MVC3:暫時禁用驗證

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM