如何将空字符串保存为字符串.保存更改时为空

本文关键字:字符串 保存更改 保存 | 更新日期: 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:暂时禁用验证