【问题标题】:Why does my default value column automatically get populated by a date of January 1, 0001?为什么我的默认值列会自动填充日期为 0001 年 1 月 1 日?
【发布时间】:2025-12-08 03:45:01
【问题描述】:

表定义

模型定义

代码

using MyRandomizer.Models;

namespace MyRandomizer
{
    class Program
    {
        static void Main(string[] args)
        {
            using (Database1Entities db = new Database1Entities())
            {

                Category c = new Category();
                c.Name = "Integral";

                db.Categories.AddObject(c);
                db.SaveChanges();

            }
        }
    }
}

输出

问题

为什么我的默认值列会自动填充 0001 年 1 月 1 日这一日期?

【问题讨论】:

  • 我还没有使用过多的 EntityFramework 但是你的模型定义中的 DefaultValue 是否为空有关系吗?这可能会覆盖 sql 的默认值。
  • 可能无关紧要,但如果它只是一个 CreationDate 不应该是 Identity 而不是 Computed?它不会在每行更新时都更改是吗?

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


【解决方案1】:

如果您在设计器中设置StoreGeneratedPattern="Computed",则它仅包含在概念模型 (CSDL) 中。但是您在存储模型 (SSDL) 中也需要它。如果您不这样做,EF 将生成 INSERT 语句,该语句将包含日期的当前值,即DataTime.MinValue。无法从设计器编辑存储模型。您必须以 XML 格式打开 EDMX 文件并手动更新行定义。

最终定义应如下所示:

<edmx:Edmx ...>
  <edmx:Runtime>
    <edmx:StorageModels> 
      <Schema ...>
        <EntityContainer Name="...">
          <EntitySet Name="Categories" EntityType="...Categories" store:Type="Tables" Schema="dbo" />
          ...
        </EntityContainer>
        <EntityType Name="Categories"/>
          ...
          <!-- Here you must add StoreGeneratedPattern -->
          <Property Name="CreationDate" Type="datetime" Nullable="false" StoreGeneratedPattern="Computed" /> 
        </EntityType>
      </Schema>
    </edmx:StorageModels>
    ...
  </edmx:Runtime>
</edmx:Edmx>

但是这个解决方案有一个大问题。手动修改 SSDL 部分后,您不应使用“从数据库更新”,否则您必须在每次调用“从数据库更新”后执行此更改。原因是“从数据库更新”删除了 EDMX 的当前 SSDL 部分,并根据当前 DB 结构创建新的部分。

【讨论】:

    【解决方案2】:

    看图模型定义。未指定默认值。您的数据库实体不知道默认值。因此,它使用 CreationDate 的当前值。尝试将模型定义的默认值设置为合理的值。

    【讨论】:

    • 如何将默认值设置为创建行的日期?
    • 我的编辑器不在身边,所以目前无法准确指导您。或者,您也可以在 c.Name = "Integral"; 之后设置 c.CreationDate = DateTime.Now;
    最近更新 更多