【问题标题】:not setting date property to object results in error未将日期属性设置为对象会导致错误
【发布时间】:2010-11-29 16:25:27
【问题描述】:

我有一个表,其中有一个smalldatetime NOT NULL 字段,默认值为getdate()。在表中创建新记录时,我没有通过 LINQ To SQL 语法在代码中设置smalldatetime 字段,我只是让数据库设置默认值,即当前日期。如果我没有在代码中明确设置它,它会引发以下错误:

SqlDateTime 溢出。必须在 1753 年 1 月 1 日凌晨 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59 之间。

如果我在数据库中设置默认值,为什么必须在代码中设置它?当涉及到 LINQ To SQL 时,我注意到带有日期的一些时髦的东西。

【问题讨论】:

标签: c# linq-to-sql sql-server-2008


【解决方案1】:

与其将字段设置为IsDbGenerated,不如考虑将其AutoSync 值设置为OnInsertIsDbGenerated 永远不会让您设置字段的值(这可能是您想要的“创建日期”字段,但不是“最后修改”字段)。

但是,如果您使用的是 ORM,我会要求您考虑是否要将应用程序逻辑同时包含在数据库和应用程序代码中。在代码中实现默认值是否更有意义(通过partial methods,如Insert[Entity])?

【讨论】:

  • 感谢有关 ISDbGenerated 属性的提示。
【解决方案2】:

您必须设置生成的属性,以便 LINQ to SQL 不会发送其默认值以进行创建。

该属性在实体上称为“自动生成值”。

【讨论】:

  • 好的,我会试一试,让你知道。出于好奇,LINQ to SQL 发送的默认值是什么?
  • 它使用 .NET 认为 DateTime 的默认值。在实践中,我相信它会发送January 1 0000
  • 好吧,你会认为他们至少会好心地发送当前日期,哈哈。
【解决方案3】:

要解决此问题,请确保您的 LINQ To SQL 模型知道您的 smalldatetime 字段是由数据库自动生成的。

在 LINQ To SQL 图表中选择表的字段,然后找到“属性”窗口。将 Auto Generated Value 属性调整为 True。这将确保该字段不包含在 LINQ To SQL 生成的INSERT 语句中。

或者,您必须自己指定:

if (newCustomer.DateTimeCreated == null) {
       newCustomer.DateTimeCreated = DateTime.Now; // or UtcNow 
 }

【讨论】:

    【解决方案4】:

    LINQ To SQL 不会以您随后可以更新值的方式观察数据库默认值。为了允许这样做,您需要在代码中设置默认值。

    当使用数据库默认创建NOT NULL 的新对象时,C# 将使用默认值,例如 MinValue 用于数字和日期、空 GUID(零)等。您可以查找这些条件并替换为您自己的默认值。

    这是 LINQ To SQL 的一个已知设计问题。如需深入讨论,请参阅此链接:

    http://www.codeproject.com/KB/linq/SettingDefaultValues.aspx

    一些用于在应用程序中设置默认值的示例代码:

    private void SetDefaults(object LinqObj)
    {
        // get the properties of the LINQ Object
        PropertyInfo[] props = LinqObj.GetType().GetProperties();
    
        // iterate through each property of the class
        foreach (PropertyInfo prop in props)
        {
            // attempt to discover any metadata relating to underlying data columns
            try
            {
                // get any column attributes created by the Linq designer
                object[] customAttributes = prop.GetCustomAttributes
                (typeof(System.Data.Linq.Mapping.ColumnAttribute), false);
    
                // if the property has an attribute letting us know that 
                // the underlying column data cannot be null
                if (((System.Data.Linq.Mapping.ColumnAttribute)
                (customAttributes[0])).DbType.ToLower().IndexOf("not null") != -1)
                {
                    // if the current property is null or Linq has set a date time 
                // to its default '01/01/0001 00:00:00'
                    if (prop.GetValue(LinqObj, null) == null || prop.GetValue(LinqObj, 
                    null).ToString() == (new DateTime(1, 1, 1, 0, 0, 0)).ToString())
                    {
    
                        // set the default values here : could re-query the database, 
                        // but would be expensive so just use defaults coded here
                        switch (prop.PropertyType.ToString())
                        {
                            // System.String / NVarchar
                            case "System.String":
                                prop.SetValue(LinqObj, String.Empty, null);
                                break;
                            case "System.Int32":
                            case "System.Int64":
                            case "System.Int16":
                                prop.SetValue(LinqObj, 0, null);
                                break;
                            case "System.DateTime":
                                prop.SetValue(LinqObj, DateTime.Now, null);
                                break;
                        }
                    }
                }
            }
            catch
            {
                // could do something here ...
            }
        }
    

    【讨论】:

    • 是不是它观察到了,你告诉它观察一下?
    • 约翰的回答部分正确。您可以在永远不会按照 bdukes 指示更新字段的情况下执行此操作。
    猜你喜欢
    • 2012-12-19
    • 2018-03-22
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多