我在数据库中有一列不能为空,我想将其设置为在数据库中具有默认值。问题是实体框架似乎自己创建了一个默认值(例如,int => 0),并且完全忽略了数据库中的默认值约束。禁用实体框架的默认值生成(代码优先)
有什么办法可以禁用这个默认的实体框架的价值?
我在数据库中有一列不能为空,我想将其设置为在数据库中具有默认值。问题是实体框架似乎自己创建了一个默认值(例如,int => 0),并且完全忽略了数据库中的默认值约束。禁用实体框架的默认值生成(代码优先)
有什么办法可以禁用这个默认的实体框架的价值?
从本质上讲,实体框架不允许这样做。你必须为它做一些代码。 This answer from another site似乎解决了许多人的问题。
他“黑客”它(他说)做这样的事情:
public partial class YourEntityClass {
public YourEntityClass() {
this.PropertyNameWithDefaultValue = default(int);
}
}
注1:有人提到它可能无法在EF4工作
个人注释:对不起,我的英语,我通常说法语。
您可以通过“属性”窗口更新EDMX
模型以更改任何列的默认值。但是,实体框架似乎不会自动获取约束条件DEFAULT
。不知道是否有办法让它做到这一点。
有时我们需要手动执行EF不会为我们自动执行的操作。
如果使用EF 4.1“代码优先”,我通常创建IDatabaseInitializer派生的分离类DbInitializer,并在InitializeDatabase方法的实现,只需要调用
context.Database.ExecuteSqlCommand("ALTER TABLE TABLENAME ... ");
现在在静态构造函数从的DbContext派生类,只需调用初始化:
Database.SetInitializer(new DbInitializer());
通过这种方式,它可以指定任何数据库DML/DDL命令来改变表/列只是为了确保数据库就像是我们想要的。
谢谢,这也很有用。还不能投票。 –
我发现你可以用下列属性装饰你的领域。
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
EF中的“Computed”字段与SQL中的默认值字段不同。计算字段是在服务器上计算的字段,在提交对象时不应更改。如果将计算标签放在字段上,当您第一次创建对象时,您将获得默认值,但之后您将无法更改该字段。因此,如果您从数据库获取实体对计算字段进行更改,然后在您的实体上下文中调用“saveChanges()”,则字段将不会在数据库中更改。
更好地使用EF默认值,方法是在EDMX编辑器中设置属性的默认值。
EDMX更新程序在实体字段和数据库字段之间存在一对一映射时,无法读取字段默认值,这是一个令人痛心的事情。
太糟糕了,我们使用Code First :( –
我更新了示例以使其有效。这是正确的答案,它适用于所有EF版本。 EF不会将数据库默认值用于可从应用程序中设置的属性 - 这是设计。 –
感谢@Ladislav纠正我的答案。 –
所以,没有办法做我想做的事。感谢您的回答。 –