我有一个标准的ASP.NET 4动态数据站点(使用Linq to SQL)。
在我的SQL-Server数据库中,我有数百个varchar字段设置为NOT NULL,但默认值为空字符串。它们永远不应该是NULL,但它们可能有一个空字符串作为内容。
在动态数据站点上编辑这些字段时,内部逻辑将字段视为NOT NULL,并且在TextBox1.Text(这是一个空字符串)之间的某处,并调用UPDATE sql,它将值设置为NULL并且它们更新失败
我可以看到System.Web.DynamicData.MetaColumn有一个属性'ConvertEmptyStringToNull',但它是只读的。
如何防止空字符串变为NULL而不必更改所有数百个字段的属性,我该怎么办?
答案 0 :(得分:0)
您是否只有一个程序来调用您的数据库? 如果是这样,您可以在此处检查字段值,或者只是为每个值附加一个空字符串。
答案 1 :(得分:0)
在 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。
答案 2 :(得分:0)
由于您希望在数据库中设置默认值(空字符串)而不在应用程序中,因此请考虑使用相关列上的元数据来默认为数据库的初始化:
[Column(IsDbGenerated = true, UpdateCheck = UpdateCheck.Never, AutoSync=AutoSync.Never)]
public object MyColumn { get; set; }