禁用实体框架的默认值生成(代码优先)
Posted
技术标签:
【中文标题】禁用实体框架的默认值生成(代码优先)【英文标题】:Disabling Entity Framework's default value generation (Code First) 【发布时间】:2011-07-27 15:26:26 【问题描述】:我在数据库中有一个不能为空的列,我想将它设置为在数据库中具有默认值 。问题是实体框架似乎自己创建了一个默认值(例如int => 0),完全忽略了数据库中的默认值约束。
有没有办法禁用实体框架的这种默认值?
【问题讨论】:
【参考方案1】:我发现您可以使用以下属性来装饰您的字段。
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
【讨论】:
【参考方案2】:本质上,实体框架不允许这样做。你必须对它做一些代码。 This answer from another site 似乎解决了很多人的问题。
他通过做类似的事情“破解”它(正如他所说):
public partial class YourEntityClass
public YourEntityClass()
this.PropertyNameWithDefaultValue = default(int);
注意 1:有人提到它可能在 EF4 中不起作用
个人说明:对不起我的英语,我通常说法语。
【讨论】:
我将示例更新为有效。这是正确答案,适用于所有 EF 版本。 EF 不使用可以从您的应用程序设置的属性的数据库默认值 - 这是设计使然。 所以,没有办法做我想做的事。谢谢你的回答。【参考方案3】:有时我们需要手动完成 EF 不会自动为我们做的事情。
如果使用EF 4.1“代码优先”,我通常会创建一个从IDatabaseInitializer派生的分离类DbInitializer,并且在InitializeDatabase方法的实现中,只需调用
context.Database.ExecuteSqlCommand("ALTER TABLE TABLENAME ... ");
现在在派生自 DbContext 的类的静态构造函数中,只需调用初始化器:
Database.SetInitializer(new DbInitializer());
通过这种方式,可以指定任何数据库 DML/DDL 命令来更改表/列,以确保数据库符合我们的要求。
【讨论】:
谢谢,这也很有用。还不能投票。【参考方案4】:EF 中的“计算”字段与 SQL 中具有默认值的字段不同。计算字段是在服务器上计算的字段,在提交对象时不应更改。如果您在字段上放置 Computed 标签,您将在第一次创建对象时获得默认值,但稍后您将无法更改该字段。因此,如果您从数据库中获取实体对计算字段进行更改,然后在您的实体上下文中调用“saveChanges()”,则该字段不会在数据库中更改。
通过在 EDMX 编辑器中设置属性的默认值来更好地使用 EF 默认值。
当实体字段和数据库字段之间存在一对一映射时,EDMX 更新程序无法读取字段默认值,这很让人头疼。
【讨论】:
太糟糕了,我们使用的是 Code First :(【参考方案5】:您可以通过“属性”窗口更新EDMX
模型以更改任何列的默认值。但是,实体框架似乎不会自动拾取DEFAULT
约束。不知道有没有办法让它做到这一点。
【讨论】:
以上是关于禁用实体框架的默认值生成(代码优先)的主要内容,如果未能解决你的问题,请参考以下文章
EF 6.X 中的实体框架代码优先 Fluent API 默认值