24

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

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

您知道发生这种情况的任何原因吗?请告诉我。

非常感谢。

4

6 回答 6

18

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

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

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

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

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

更多关于这里的讨论:

如何在实体框架中使用数据库中的默认列值?

于 2013-08-29T08:45:31.647 回答
2

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

例如:

public class SomeTable
{
    ...

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

    ...
}

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

于 2016-04-02T12:16:01.507 回答
2

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

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

DatabaseGeneratedOption.Computed表示它是由数据库设置的,不能被实体框架更改。DatabaseGeneratedOption.Identity表示该列是一个IDENTITY列,它应该只用于自动递增数字主键。

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

于 2017-03-18T03:26:25.940 回答
0

尝试使用它。

public virtual DateTime CreatedDate { get; set; } = new Datetime();
于 2019-07-17T01:52:54.850 回答
0

您也可以在实体数据模型的 GUI 中设置StoreGeneratedPattern为 Computed(如 Malcolm 建议的那样)。

在 Visual Studio 中打开你的.edmx文件 打开字段的属性(点击字段 -> 点击F4right-click->properties)设置StoreGeneratedPattern为 Computedproperties window如下图所示:

实体框架 - SQL Server 表中未设置默认值

于 2021-05-11T13:44:47.757 回答
-1

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

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

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

希望这可以帮助!

于 2016-12-02T12:35:08.277 回答