禁用Entity Framework的默认值生成(Code First)

9
我在数据库中有一列是不能为null的,并且我想要设置默认值在数据库中。问题是entity framework似乎会自动创建一个默认值(比如int => 0),并且完全忽略数据库中的默认值约束。
是否有办法禁用entity framework的默认值设定?
5个回答

6
我发现你可以使用以下属性装饰你的字段。
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]

3
在EF中,“Computed”字段与SQL中具有默认值的字段不同。计算字段是在服务器上计算的字段,在提交对象时不应更改。如果在字段上放置“Computed”标记,则在首次创建对象时将获得默认值,但稍后您将无法更改该字段。因此,如果从数据库获取实体并更改计算字段,然后在实体上下文中调用“saveChanges()”,则该字段将不会在数据库中更改。
最好通过在EDMX编辑器中设置属性的默认值来使用EF默认值。
令人烦恼的是,当实体字段和数据库字段之间存在一对一映射时,EDMX更新程序无法读取字段默认值。

真可惜,我们正在使用 Code First :( - Kornél Regius

3
有时候我们需要手动完成EF没有自动处理的工作。
如果使用EF 4.1 "Code First",我通常会创建一个继承自IDatabaseInitializer的单独的DbInitializer类,在实现InitializeDatabase方法时,只需调用。
context.Database.ExecuteSqlCommand("ALTER TABLE TABLENAME ... ");

现在,在从DbContext派生的类的静态构造函数中,只需调用初始化程序即可:
Database.SetInitializer(new DbInitializer());

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


1
谢谢,这也很有用。暂时不能点赞。 - Kornél Regius

3
本来,Entity Framework 并不允许这样做。你需要编写一些代码来实现它。这篇来自其他网站的答案似乎已经为很多人解决了这个问题。
他通过类似以下的方式“黑客”了它(如他所说):
public partial class YourEntityClass {
     public YourEntityClass() {
         this.PropertyNameWithDefaultValue = default(int);
     }
}

注意1:有人提到它可能无法在EF4中工作。
个人说明:抱歉我的英语不好,我通常讲法语。

1
我更新了示例以使其有效。这是正确的答案,并且在所有 EF 版本中都可以正常工作。EF 不会使用数据库默认值来设置可以从应用程序中设置的属性 - 这是按设计而来的。 - Ladislav Mrnka
所以,没有办法做到我想要的。感谢您的答复。 - Kornél Regius

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接