如何将空字符串保存为字符串.保存更改时为空
本文关键字:字符串 保存更改 保存 | 更新日期: 2023-09-27 18:03:37
假设我有一个这样的类(为简洁起见省略了细节):
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和datatable low的示例。您可以对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)]
解决了问题。
注:
[Required]
的字符串属性,这是微小的差异相比,问题问。为什么将String初始化为null?如果你使用:
string pc = String.Empty;
var address = New Address() { PostalCode = pc };
如果你想确保never为空,你可以使用@DavidG的解决方案,但如果你想检查何时为空,你只需要初始化为String。空
可能是设置配置。在调用SaveChanges()之前,在上下文类中ValidateOnSaveEnabled = false将起作用。
context.Configuration.ValidateOnSaveEnabled = false;
context.SaveChanges();
Entity Framework/MVC3:暂时禁用验证