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

时间:2011-07-27 15:26:27

标签: c# entity-framework-4 code-first

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

有没有办法禁用实体框架的默认值?

5 个答案:

答案 0 :(得分:6)

我发现您可以使用以下属性修饰字段。

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]

答案 1 :(得分:3)

有时我们需要手动执行EF不会自动执行的操作。

如果使用EF 4.1“Code First”,我通常会创建一个从IDatabaseInitializer派生的独立类DbInitializer,并且在InitializeDatabase方法的实现中,只需调用

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

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

Database.SetInitializer(new DbInitializer());

通过这种方式,可以指定任何数据库DML / DDL命令来改变表/列,以确保数据库符合我们的要求。

答案 2 :(得分:3)

原生,Entity框架不允许这样做。你必须做一些代码。 This answer from another site似乎解决了许多人的问题。

他通过做类似的事情来“破解”它(正如他所说的那样):

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

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

个人提示:对不起我的英语,我通常说法语。

答案 3 :(得分:3)

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

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

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

答案 4 :(得分:0)

您可以通过“属性”窗口更新EDMX模型以更改任何列的默认值。但是,实体框架似乎不会自动获取DEFAULT约束。不确定是否有办法让它做到这一点。