假设我的数据库中有以下表格:
CREATE TABLE [dbo].[Test]
(
[Id] INT IDENTITY (1, 1) NOT NULL,
[Active] BIT DEFAULT ((1)) NOT NULL,
)
从此数据库创建EF模型时,Active
位列的映射(映射到Boolean
列)没有默认值(请参阅属性“默认值):
为什么实体框架的行为方式如此?为什么在创建模型时,数据库中定义的默认值不会自动应用于模型中?数据库指出默认值应为1
,我假设它是模型中的默认值true
。我是否真的必须再次为模型中的所有列设置默认值?
我检查了 int 和位列的此行为。
我做了一些调查,并试图手动将“默认值”属性设置为True
和true
,两者都有效。
Test-entity的自动生成构造函数从
更改public Test()
{
}
到
public Test()
{
this.Active = true;
}
因此,在EF中可以使用默认值,但是在基于数据库优先生成模型时不会设置它们,至少不在我的机器上。
所以,问题仍然存在:我是否真的必须再次为模型中的所有列设置默认值,即使它们已经在数据库中设置了?
答案 0 :(得分:2)
试试这个:
StoreGeneratedPattern = Calculated
编辑:
对于单一代码行答案感到抱歉,但最后一天我真的很匆忙。
要使EF设置属性的db默认值,最快的方法是打开.edmx设计器,单击感兴趣的字段并设置
StoreGeneratedPattern =已计算
在其属性中(您可以在第二个屏幕截图中看到此属性,将“默认值”设置为true)。
答案 1 :(得分:0)
此解决方案可解决具有相同属性的所有实体,例如 CreatedDateTime
public partial class MyEntities : ObjectContext
{
public override int SaveChanges(SaveOptions options)
{
this.DetectChanges();
foreach (var insert in this.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added))
{
if (insert.Entity.GetType().GetProperty("CreatedDateTime") != null && insert.Entity.GetType().GetProperty("CreatedDateTime").GetType().Name == "DateTime" && (DateTime)(insert.Entity.GetType().GetProperty("CreatedDateTime").GetValue(insert.Entity)) == DateTime.Parse("0001-01-01 00:00:00.0000000"))
insert.Entity.GetType().GetProperty("CreatedDateTime").SetValue(insert.Entity, DateTime.UtcNow, null);
}
return base.SaveChanges(options);
}
}