在实体框架数据库优先方法中将默认值 1 设置为实体名称(状态)

Posted

技术标签:

【中文标题】在实体框架数据库优先方法中将默认值 1 设置为实体名称(状态)【英文标题】:Set Default Value 1 to an EntityName (Status) in Entity Framework database-first approach 【发布时间】:2016-06-09 09:14:50 【问题描述】:

我使用的是 Entity Framework 5.0,我已在我的后端数据库中将 Status 列的默认值设置为 1。但是在插入新记录时,它默认为status 列生成0。我希望 1 作为数据库中设置的默认值,但 Entity Framework 将其更改为 0。

【问题讨论】:

【参考方案1】:

您必须打开edmx 文件并从相应实体中选择Status 属性。然后按F4 显示Property-View。您必须为StoreGeneratedPattern 选择IdentityItentity 表示数据库在INSERT 上生成值,而不是在UPDATE 上生成值。

【讨论】:

“不支持使用“身份”模式修改列。列:“状态”。表:“lamiModel.Store.finish”。” 这就是我得到的例外当我尝试更新一个 storedGenaratedPattern= Identity 时。你的伎俩不起作用 我认为该列是只读的,仅由数据库设置。 它在惰性化 1 但更新为 0 时出现异常【参考方案2】:

如果您通过实体框架以外的方式插入记录,或者如果您在已包含记录的表上创建新的非空列,则在数据库中设置默认值很有用。 在 Code First 中,您可以在迁移中指定数据库默认值:

public override void Up()
    
   AddColumn("dbo.Foos", "Status", c => c.Integer(nullable: false, defaultValue: 1));

C# 默认将整数设置为零,这就是 Entity Framework 覆盖数据库的原因。

因此,如果实体类不是该类型的默认值,您还必须在实体类中设置默认值:

//partial is only necessary in Database First
public partial class Foo

   private int _Status = 1;

   public int Status
   
      get return _Status; 
      set _Status = value; 
   

...或者如果您更喜欢构造函数初始化:

public partial class Foo

   public Foo()
   
      Status = 1;
   

   public int Status  get; set; 

...而且,如果您使用的是 C# 6.0:

public partial class Foo

   public int Status  get; set;  = 1;

【讨论】:

如果我必须编写 7 到 10 行代码来设置默认值,为什么我不应该只插入 obj.Status=1;达到目的 为了使其成为默认值,您应该将该行放在构造函数中。构造函数初始化与支持字段初始化取决于您。我的 IDE 中的重构工具使创建支持字段变得非常简单

以上是关于在实体框架数据库优先方法中将默认值 1 设置为实体名称(状态)的主要内容,如果未能解决你的问题,请参考以下文章

实体框架代码优先 - 不可为空类型的默认值

实体框架支持来自数据库优先方法的默认约束

EF 6.X 中的实体框架代码优先 Fluent API 默认值

在实体框架中将模型属性设置为布尔值

实体框架代码优先问题(SimpleMembership UserProfile 表)

如何在实体框架代码优先方法中使用表值函数?