我正在通过 EntityFramework 4 (EF) 将对象插入 SQL Server 数据库。在接收表上有 ( CreatedDate
) 列,其默认值设置为getdate()
。所以我不将它提供给 EF 假设它的值将被 SQL Server 默认为getdate()
.
但是,这不会发生;而是 EF 返回验证错误 n SaveChanges()
。
您知道发生这种情况的任何原因吗?请告诉我。
非常感谢。
我正在通过 EntityFramework 4 (EF) 将对象插入 SQL Server 数据库。在接收表上有 ( CreatedDate
) 列,其默认值设置为getdate()
。所以我不将它提供给 EF 假设它的值将被 SQL Server 默认为getdate()
.
但是,这不会发生;而是 EF 返回验证错误 n SaveChanges()
。
您知道发生这种情况的任何原因吗?请告诉我。
非常感谢。
如果您不想编辑该值(例如创建日期),您可以使用:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public virtual DateTime CreatedDate { get; set; }
这将告诉实体框架该值由数据库控制,但仍会获取该值。
请注意,您无法更改该值,因此如果您只是想要一个初始值,这不是一个解决方案。
如果您只想要一个默认值但仍允许对其进行编辑,或者您使用的是 Entity Framework 5 及更低版本,则必须在代码中设置默认值。
更多关于这里的讨论:
只需将[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
属性应用于实体对象定义中的列字段。
例如:
public class SomeTable
{
...
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime CreatedDate { get; set; }
...
}
这告诉实体框架您的列的初始值是由数据库提供的。插入行后,该值将自动从数据库中更新。
这个问题的正确答案是告诉 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
引发异常。所以那里没有运气。
尝试使用它。
public virtual DateTime CreatedDate { get; set; } = new Datetime();
您也可以在实体数据模型的 GUI 中设置StoreGeneratedPattern
为 Computed(如 Malcolm 建议的那样)。
在 Visual Studio 中打开你的.edmx
文件 打开字段的属性(点击字段 -> 点击F4或right-click->properties
)设置StoreGeneratedPattern
为 Computedproperties window
如下图所示:
为了开始工作,我声明了一个新变量并将该变量设置为当前时间。然后在插入数据时,我将变量引用到列:
var db = new YourTableEntities();
var dateNow = DateTime.Now;
db.YourTableEntities.Add(new YourTableEntities()
{
ColumnAInTable = someAVariable,
ColumnBInTable = someBVariable,
ColumnThatShouldDefaultToGetDate = dateNow
});
希望这可以帮助!