禁用实体框架的默认值生成(代码优先)

本文关键字:代码 实体 框架 默认值 | 更新日期: 2023-09-27 18:03:48

我在数据库中有一列不能为空,我想将其设置为在数据库中具有默认值。问题是实体框架似乎自己创建了一个默认值(例如,int => 0),并且完全忽略了数据库中的默认值约束。

是否有办法禁用这个实体框架的默认值?

禁用实体框架的默认值生成(代码优先)

我发现您可以使用以下属性来装饰您的字段。

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]

本质上,实体框架不允许这样做。你需要对它写一些代码。这个来自另一个网站的答案似乎已经为许多人解决了这个问题。

他通过做这样的事情来"破解"它(正如他所说的):

public partial class YourEntityClass {
     public YourEntityClass() {
         this.PropertyNameWithDefaultValue = default(int);
     }
}

注释1:有人提到它可能在EF4中不起作用

个人笔记:很抱歉我的英语不好,我通常说法语

有时我们需要手动完成EF不能自动为我们完成的工作。

在使用EF 4.1"代码优先"的情况下,我通常创建一个从IDatabaseInitializer派生的分离类DbInitializer,并且在initializeddatabase方法的实现中,只需调用

context.Database.ExecuteSqlCommand("ALTER TABLE TABLENAME ... ");

现在,在从DbContext派生的类的静态构造函数中,只需调用初始化式:

Database.SetInitializer(new DbInitializer());

通过这种方式,可以指定任何数据库DML/DDL命令来修改表/列,以确保数据库像我们想要的那样。

EF中的"Computed"字段与SQL中的默认值字段不同。计算字段是在服务器上计算的字段,在提交对象时不应更改。如果在字段上放置Computed标记,则在第一次创建对象时将获得默认值,但之后将无法更改该字段。因此,如果您从DB获取一个实体,对计算字段进行更改,然后在实体上下文中调用"saveChanges()",则该字段不会在DB中更改。

最好通过在EDMX编辑器中为属性设置默认值来使用EF默认值。

当实体字段和数据库字段之间存在一对一的映射时,EDMX更新程序无法读取字段默认值,这是一个令人痛苦的问题。

您可以通过Properties窗口更新EDMX模型来更改任何列的默认值。然而,实体框架似乎不会自动拾取DEFAULT约束。不确定是否有办法做到这一点