0

我有一个标准的 ASP.NET 4 动态数据站点(使用 Linq to SQL)。

在我的 SQL-Server 数据库中,我有数百个设置为 NOT NULL 的 varchar 字段,但默认值为空字符串。它们永远不应该为 NULL,但它们可能有一个空字符串作为内容。

在动态数据站点上编辑这些字段时,内部逻辑将字段视为 NOT NULL 并且介于 TextBox1.Text (这是一个空字符串)之间并调用 UPDATE sql 它将值设置为 NULL 并且它们更新失败。

我可以看到 System.Web.DynamicData.MetaColumn 有一个属性“ConvertEmptyStringToNull”,但它是只读的。

我可以做些什么来防止空字符串变为 NULL 而不必更改所有数百个字段的属性?

4

3 回答 3

0

你有一个调用数据库的过程吗?
如果是这样,您可以在此处检查字段值,或者只是将空白字符串附加到每个值。

于 2012-02-15T11:23:40.110 回答
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。

于 2012-02-17T20:47:25.490 回答
0

由于您希望在数据库中而不是在应用程序中设置默认值(空字符串),请考虑在相关列上使用元数据以默认为数据库的初始化:

[Column(IsDbGenerated = true, UpdateCheck = UpdateCheck.Never, AutoSync=AutoSync.Never)]
public object MyColumn { get; set; }
于 2012-05-16T18:04:46.117 回答