假设我有一个类似的课程(为简洁起见省略了详细信息):
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
,而是将其保存为空字符串?
答案 0 :(得分:3)
一个选项是更改属性的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;
}
}
}
答案 1 :(得分:1)
您始终可以循环遍历类的不同部分,并使用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;
}
答案 2 :(得分:1)
由于某种原因,answer对我不起作用。很可能是因为一些EF underlying setting。
但是,在AllowEmptyStrings = true
上添加[Required]
,即
[Required(AllowEmptyStrings = true)]
解决了这个问题。
P.S。我在字符串属性上有[Required]
,与问题相比,这是一个微小的差异。
答案 3 :(得分:0)
为什么要将String初始化为null?可能是你使用:
string pc = String.Empty;
var address = New Address() { PostalCode = pc };
如果你想确保永远不为null你可以使用@DavidG的解决方案,但如果你想检查何时为null,你可能需要初始化为String.Empty
答案 4 :(得分:0)
在调用SaveChanges()之前,可能在上下文类中设置Configuration.ValidateOnSaveEnabled = false。
context.Configuration.ValidateOnSaveEnabled = false;
context.SaveChanges();