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

时间:2016-08-23 22:53:41

标签: c# sql-server entity-framework

假设我有一个类似的课程(为简洁起见省略了详细信息):

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,而是将其保存为空字符串?

5 个答案:

答案 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();

Entity Framework/MVC3: temporarily disable validation