C# EntityFramework未使用默认值更新列
我正在通过EntityFramework 4(EF)将一个对象插入SQL Server数据库。在接收表上有一列(C# EntityFramework未使用默认值更新列,c#,sql,sql-server,entity-framework,C#,Sql,Sql Server,Entity Framework,我正在通过EntityFramework 4(EF)将一个对象插入SQL Server数据库。在接收表上有一列(CreatedDate),其默认值设置为getdate()。因此,假设SQL Server将其值默认为getdate(),我不会将其提供给EF 然而,这并没有发生;相反,EF返回一个验证错误nSaveChanges() 你知道发生这种事的原因吗?请让我知道 非常感谢 如果您永远不想编辑该值(如创建日期),可以使用: [DatabaseGenerated(DatabaseGenerate
CreatedDate
),其默认值设置为getdate()
。因此,假设SQL Server将其值默认为getdate()
,我不会将其提供给EF
然而,这并没有发生;相反,EF返回一个验证错误nSaveChanges()
你知道发生这种事的原因吗?请让我知道
非常感谢 如果您永远不想编辑该值(如创建日期),可以使用:
[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; }
...
}
这告诉实体框架,列的初始值由数据库提供。行插入后,该值将从数据库自动更新。为了开始工作,我声明了一个新变量,并将该变量设置为当前时间。然后,在插入数据时,我将变量引用到列:
var db = new YourTableEntities();
var dateNow = DateTime.Now;
db.YourTableEntities.Add(new YourTableEntities()
{
ColumnAInTable = someAVariable,
ColumnBInTable = someBVariable,
ColumnThatShouldDefaultToGetDate = dateNow
});
希望这有帮助 这个问题的正确答案是告诉实体框架该列是计算出来的
[数据库生成(DatabaseGeneratedOption.Computed)]
公共虚拟日期时间CreatedDate{get;set;}
DatabaseGeneratedOption.Computed
表示它是由数据库设置的,不能由实体框架更改DatabaseGeneratedOption.Identity
表示该列是一个列,它应该只用于自动递增数字主键
**请注意,的文档没有提到任何关于标识列的内容(部分原因是这是SqlServer特定的实现细节)。相反,它将Identity选项定义为“数据库在插入行时生成一个值”。我实际上在寻找一种方法,允许在创建记录时使用默认约束设置ModDate,但允许在更新记录时从实体框架修改ModDate。因此,由于描述的原因,我认为我可能已经找到了解决方案,但是当记录标记为DatabaseGeneratedOption.Identity
时,尝试修改记录的ModDate时引发了异常。所以这里没有运气。试着用这个
public virtual DateTime CreatedDate { get; set; } = new Datetime();
您还可以在实体数据模型的GUI中将
StoreGeneratedPattern
设置为Computed(如Malcolm所建议的)
在Visual Studio中打开.edmx
文件
打开字段的属性(单击字段->点击F4或右键单击->属性
)
将StoreGeneratedPattern
设置为在properties窗口中计算,如下所示:
我想这应该对你有帮助。这里的最高评分答案可能有帮助:(可能没有)。不是真的。你可以这样做。看我对这个问题的回答。同意不是真的,但看@CptRobby的答案below@kkahl在撰写本文时是这样的,我更新了答案不适用于我-我的表中有三个默认值(NEWID()
,SYSTEM\u USER
,和GETDATE()
),我用[DatabaseGenerated]标记了每个字段(DatabaseGeneratedOption.Identity)
,我得到一个或多个实体的错误验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。
。当然,您需要进入调试器并查看附加到异常的额外信息(在EntityValidationErrors属性中)。EntityFramework可能只是无法解析/理解其中一个列值。我的经验表明,您可能希望尝试一次添加这些值以找到罪魁祸首。我还猜测它最有可能与日期列有关,日期列应该可以支持,但可能很难正确,因为有这么多的日期格式和结构在混合中可用。虽然您在这里的思路正确,但正确的答案是@CptRobby的答案,使用数据注释:[DatabaseGenerated(DatabaseGeneratedOption.Computed)]是的,DateTime
列作为标识列是非常少见的。