添加int属性后,EF使其成为可空列
本文关键字:属性 int EF 添加 | 更新日期: 2023-09-27 18:03:03
我正在添加一个名为Order的int属性到已经在DB表中有记录的现有实体。
public class Page : Content
{
// ...
public int Order { get; set; }
// ...
}
然而,当我运行"update-database"时,它将列添加为可空值,默认值为null。我尝试使用[DefaultValue(0)],以及在构造函数中设置默认值。既不工作。
如何将列/属性添加到现有的数据集,并将其填充为0的非空值?谢谢。
从SQL Server开始:
如果您只是从SQL Server management studio用户界面插入列,这是DDL:
ALTER TABLE dbo.MyTable ADD
[Order] int NULL;
ALTER TABLE dbo.MyTable ADD CONSTRAINT
DF_MyTable_Order DEFAULT 0 FOR [Order];
列内容为空。如果指定该列不应为空,则这是DDL
ALTER TABLE dbo.MyTable ADD
[Order] int NOT NULL CONSTRAINT DF_MyTable_Order DEFAULT 0
并按预期工作(column content = 0)
手动运行此查询
ALTER TABLE dbo.MyTable ADD
[Order] int CONSTRAINT DF_MyTable_Order DEFAULT 0
列内容为空
最后手动运行此查询
ALTER TABLE dbo.MyTable ADD
[Order] int CONSTRAINT DF_MyTable_Order DEFAULT 0 WITH VALUES
列内容为0
===关于EF
当然,行为取决于你正在使用的EF提供程序(我想是SQL Server)。
奇怪的是,SQL Server 2014 (SQL Server的EF提供程序对每个SQL Server版本都有不同的支持)是,如果您指定默认的WITHOUT Required属性EF提供程序将列生成为不可空的,字段创建查询是
ALTER TABLE [dbo].[MyTable] ADD [Order] [int] NOT NULL DEFAULT 0
这种行为是从哪里来的?EF或EF供应商?
调试提供程序,似乎是EF断言列不应该为空(只指定Default)。
所以,如果你指定了Default,你可以省略Required。
但是现在,为什么在你的情况下不起作用?
我认为你的迁移有问题。
对于make may测试,我添加了这一列
[DefaultValue(0)]
public int Order { get; set; }
我使用这个迁移配置(所有东西都是自动的,所以很多人认为——我也是——这对生产环境不好)
Database.SetInitializer(new MigrateDatabaseToLatestVersion<BloggingContext, BloggingContextMigrationConfiguration>(true));
internal sealed class BloggingContextMigrationConfiguration : DbMigrationsConfiguration<BloggingContext>
{
public BloggingContextMigrationConfiguration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
}
===另一个结果
实际上我找不到一个方法来生成这样的东西
ALTER TABLE dbo.MyTable ADD
[Order] int CONSTRAINT DF_MyTable_Order DEFAULT 0 WITH VALUES
和我认为EF 6。
这是因为继承。并不是派生类型中的所有属性都可以定义为不可空的,因为层次结构上层的类型没有这些属性。
- 打开实体框架图
- 找到你的类并删除它
- 再次添加类到实体框架
我有同样的问题,这对我来说是有效的。
你有两个问题:
- 如何向现有数据集添加列/属性?
- 如何使列非空?
第二个我认为是Required
[Required]
public int Order { get; set; }
第一个问题——我不知道如何表达