[英]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;
}
為什么要將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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.