EntityFramework未使用默认值更新列

时间:2013-08-29 08:41:41

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

我通过EntityFramework 4(EF)将对象插入SQL Server数据库。在接收表上有一列(CreatedDate),其默认值设置为getdate()。所以我没有将它提供给EF,假设它的值将被SQL Server默认为getdate()

然而,这不会发生;而是EF返回验证错误n SaveChanges()

你知道这件事有什么原因吗?请告诉我。

非常感谢。

6 个答案:

答案 0 :(得分:14)

如果您不想编辑该值(例如创建日期),可以使用:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public virtual DateTime CreatedDate { get; set; }

这将告诉实体框架该值由数据库控制,但仍将获取该值。

请注意,您无法更改该值,因此如果您只是想要一个初始值,那么它就不是解决方案。

如果您只想要一个默认值但仍然允许编辑它,或者您正在使用Entity Framework 5及更低版本,则必须在代码中设置默认值。

此处有关于此的更多讨论:

How to use Default column value from DataBase in Entity Framework?

答案 1 :(得分:2)

只需将[DatabaseGenerated(DatabaseGeneratedOption.Identity)]属性应用于实体对象定义中的列字段即可。

例如:

public class SomeTable
{
    ...

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime CreatedDate { get; set; }

    ...
}

这告诉Entity Framework您的列的初始值是由数据库提供的。插入行后,该值将自动从数据库更新。

答案 2 :(得分:2)

此问题的正确答案是告诉Entity Framework该列是Computed。

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public virtual DateTime CreatedDate { get; set; }

DatabaseGeneratedOption.Computed表示它由数据库设置,不能由Entity Framework更改。 DatabaseGeneratedOption.Identity表示该列是IDENTITY列,该列仅应用于自动增量数字主键。

**请注意DatabaseGeneratedOption enumeration的文档没有提及有关IDENTITY列的任何内容(部分原因是这是一个特定于SqlServer的implimentation详细信息)。相反,它将Identity选项定义为“插入行时数据库生成值”。我实际上是在寻找一种方法,允许在创建记录时使用DEFAULT约束设置ModDate,但允许在更新记录时从Entity Framework修改它。因此,由于描述,我认为我可能已经找到了解决方案,但是当用DatabaseGeneratedOption.Identity标记时,尝试修改记录的ModDate会引发异常。那里没有运气。

答案 3 :(得分:0)

尝试使用它。

[f'{a_item}{b_item}' for a_item in a for b_item in b]

答案 4 :(得分:0)

您也可以在实体数据模型的 GUI 中将 .edmx 设置为 Computed(按照 Malcolm 的建议)。

在 Visual Studio 中打开您的 right-click->properties 文件 打开字段的属性(点击字段 -> 点击 F4StoreGeneratedPattern) 在 properties window 中将 .iloc[::-1] 设置为 Computed,如下所示:

Entity Framework - default values doesn't set in SQL server table

答案 5 :(得分:-1)

为了开始工作,我声明了一个新变量并将该变量设置为当前时间。然后,当我将引用变量的数据插入到列中时:

var db = new YourTableEntities();
var dateNow = DateTime.Now; 

db.YourTableEntities.Add(new YourTableEntities()
{
    ColumnAInTable = someAVariable,
    ColumnBInTable = someBVariable,
    ColumnThatShouldDefaultToGetDate = dateNow
});

希望这有帮助!