【问题标题】:Dropping 'DF_ETable_EDate__######' Object to Convert DateTime To DateTime2删除 'DF_ETable_EDate__######' 对象以将 DateTime 转换为 DateTime2
【发布时间】:2019-10-10 15:07:53
【问题描述】:

我有一个现有的 SQL Server 数据库,其中包含通过 EF 更新数据库迁移创建的表。我有几个如下所示的模型:

[Table("ETable")]
public class ETable
{
    [Key]
    public int Id { get; set; }

    // Other properties go here

    public DateTime EDate { get; set; }
}

后来我决定全局使用 DateTime2,但了解到我必须删除自动创建的约束对象,例如“DF_ETable_EDate__######”,以消除类似于 this post 的错误正在尝试更新数据库。

问题是,删除这些约束对象有什么影响吗?如果保留它们是有益的,我该如何将它们添加回来?

【问题讨论】:

  • 约束是数据库的重要组成部分。有不同类型的约束,例如默认约束、外键约束和唯一约束,它们都有不同的用途。删除约束将直接影响数据库保持数据完整性或为列生成默认值的能力。在 SQL Server 中,您不能更改约束,但可以删除它并创建一个新约束。
  • @ZoharPeled 在我的情况下,我对字段 EDate 'DF_ETable_EDate__######' 自动添加了一些约束,原因我不知道。我刚刚放下它。现在如何将其添加回来?
  • 将为默认列创建DF
  • 基于名称开头的DF 我猜这是默认约束,您可以使用alter table 语句添加它。例如,这将为每个新行添加当前 datetime2 的默认值:alter table ETable add constraint df.... default(sysdatetime()) for (edate)
  • @ZoharPeled 我如何通过数据库迁移来做到这一点,即:AlterColumn("dbo.ETable", "EDate", c => c.DateTime(nullable: false, precision: 0, storeType: "datetime2"));。您可以将其发布为答案吗?所以我至少可以投票吗?

标签: c# sql-server entity-framework-6


【解决方案1】:

就像其他人评论的那样,您主要处理 DateTime 字段的默认约束。

取决于您的业务规则,如果不需要,您可以安全地删除约束。否则,您可以将其设置为默认值:

To set a default to an arbitrary date:
AlterColumn("dbo.ETable", "EDate", c => c.DateTime(nullable: false, defaultValueSql: "CONVERT(datetime, '2019-01-01')"));

To set default to current date:
AlterColumn("dbo.ETable", "EDate", c => c.DateTime(nullable: false, defaultValueSql: "GETDATE()"));

【讨论】:

    猜你喜欢
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 2016-11-30
    • 2011-07-31
    • 2021-05-23
    相关资源
    最近更新 更多