C# EntityFramework未使用默认值更新列

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

我正在通过EntityFramework 4(EF)将一个对象插入SQL Server数据库。在接收表上有一列(
CreatedDate
),其默认值设置为
getdate()
。因此,假设SQL Server将其值默认为
getdate()
,我不会将其提供给EF

然而,这并没有发生;相反,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; }

    ...
}

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

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

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
列作为标识列是非常少见的。