我有一个标准的ASP.NET 4动态数据站点(使用Linq到SQL)。
在我的SQL Server数据库中,有数百个varchar字段被设置为NOT NULL,但默认值为空字符串。它们永远不应该为NULL,但它们可能有一个空字符串作为内容。
在动态数据站点上编辑这些字段时,内部逻辑会将该字段视为NOT NULL,介于TextBox1.Text(一个空字符串)和调用UPDATE sql之间,并将值设置为NULL,然后更新失败。
我可以看到System.Web.DynamicData.MetaColumn具有属性"ConvertEmptyStringToNull",但它是只读的。
在不必更改所有数百个字段的属性的情况下,我可以做些什么来防止空字符串变为NULL?
是否有一个调用数据库的过程
如果是这样,您可以在这里检查字段值,或者只在每个值后面附加一个空白字符串。
在FieldTemplates/Text_Edit.ascx.cs更改字符串的行为时,首先删除验证器,因为它们阻止表单提交:
protected void Page_Load(object sender, EventArgs e) {
TextBox1.MaxLength = Column.MaxLength;
if (Column.MaxLength < 20)
TextBox1.Columns = Column.MaxLength;
TextBox1.ToolTip = Column.Description;
if (Column.IsString)
{
this.Controls.Remove(RequiredFieldValidator1);
this.Controls.Remove(RegularExpressionValidator1);
this.Controls.Remove(DynamicValidator1);
}
else
{
SetUpValidator(RequiredFieldValidator1);
SetUpValidator(RegularExpressionValidator1);
SetUpValidator(DynamicValidator1);
}
}
将空字符串转换为NULL的代码段位于ConvertEditedValue方法中的某个位置,因此跳过字符串:
protected override void ExtractValues(IOrderedDictionary dictionary)
{
if (Column.IsString)
{
dictionary[Column.Name] = TextBox1.Text;
}
else
{
dictionary[Column.Name] = ConvertEditedValue(TextBox1.Text);
}
}
现在您可以用空字符串更新表,当然现在的问题是您可以为所有varchar字段设置空字符串,而不仅仅是那些具有默认值的字段。
在Linq-to-SQL或EF数据模型中,我看不到任何地方可以找到我的SQL Server默认值。有一个属性DefaultValue,但它始终为NULL。
由于您希望在数据库中而不是在应用程序中设置默认值(空字符串),请考虑在有问题的列上使用元数据来默认为数据库的初始化:
[Column(IsDbGenerated = true, UpdateCheck = UpdateCheck.Never, AutoSync=AutoSync.Never)]
public object MyColumn { get; set; }