实体框架如何处理数据库表中的默认约束



我正在处理代码,在完成之前我无法运行,因为这是一个漫长而乏味的过程。我的任务是向现有数据库添加一个新表,更新模型的 .edmx,并编写一个方法通过 c# 后端代码向表中添加新行。

在我的情况下,我的表上有 2 个默认约束

SomeTable
------------
ID INT IDENTITY (1,1) PRIMARY KEY CLUSTERED,
SomeDate DATETIME2 NOT NULL DEFAULT GETDATE(),
SomeOtherField VARCHAR(1024) NOT NULL DEFAULT ''

使用此表的 .edmx 模型,我将 SomeDate 的StoreGeneratedPattern设置为 Computed 。我还在SSDL中手动仔细检查了它,以确保computed StoreGeneratedPattern属性位于SomeTable实体的SomeDate字段中。

据我所知,并且不确定,当我有以下代码时

public void AddSomeRow(...)
{
    SomeDbContext context = new SomeDbContext;
    var table = new SomeTable { SomeOtherField = "Value" };
    context.SomeTables.Add(table);
    context.SaveChanges();
}

我相信SomeDate字段将设置为其默认约束(因为它尚未填充到实体中)。这是真的吗?

SomeOtherField执行上面列出的相同步骤,我仍然可以手动给它一个值(出现在该字段中的值而不是默认约束)或省略它(默认约束将设置在该字段中)?

这个问题很难解释,如果它没有意义,我深表歉意

StoreGeneratedPattern 意味着该值始终由数据库生成,因此您不能修改它。即它只对数据库计算列有意义。

至少在 EF 6.1 之前,没有直接的方法可以支持数据库默认值。您唯一能做的就是将默认值移出数据库,并在模型端(或代码优先)生成它们。你会发现一些工作点,但在某些情况下它们并不安全(特别是对于 N 层应用)。

最新更新