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

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

【问题讨论】:

    标签: c# asp.net entity-framework entity-framework-5


    【解决方案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 中的重构工具使创建支持字段变得非常简单
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多