我通过EntityFramework 4(EF)将对象插入SQL Server数据库。在接收表上有一列(CreatedDate
),其默认值设置为getdate()
。所以我没有将它提供给EF,假设它的值将被SQL Server默认为getdate()
。
然而,这不会发生;而是EF返回验证错误n SaveChanges()
。
你知道这件事有什么原因吗?请告诉我。
非常感谢。
答案 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
文件
打开字段的属性(点击字段 -> 点击 F4 或 StoreGeneratedPattern
)
在 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
});
希望这有帮助!