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

时间:2011-03-07 07:14:13

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

表定义

enter image description here

模型定义

enter image description here

代码

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();

            }
        }
    }
}

输出

enter image description here

问题

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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部分,并根据当前的数据库结构创建了新的部分。