我有很多包含默认值的表,例如 CreatedDateTime (getutcdate())
。但是现在,值0001-01-01 00:00:00.0000000代替存储。
https://stackoverflow.com/a/35093135/7731479->这无效,我必须为每个数据库模型更新(EDMX(手动为每个表手动执行此操作。如何自动将所有StoreGeneratedPattern更新为计算?或为什么它不自动计算?
https://stackoverflow.com/a/43400053/7731479-> ado.net生成所有属性,我无法再次生成CreatedDateTime
。
是否有自动解决方案?
我正在使用实体框架和ado.net。
Person person = new Person()
{
Id = id,
Name = name,
};
AddToPerson(person);
SaveChanges();
我想在上面使用。我不想使用以下内容并再次分配CreateDeteTime,因为它是在MSSQL中分配的,默认值getutcdate((。
Person person = new Person()
{
Id = id,
Name = name,
CreatedDeteTime = DateTime.UtcNow;
};
AddToPerson(person);
SaveChanges();
SQL Server表的配置 default 约束将仅使用,如果您有SQL INSERT
语句所讨论的列。
所以如果您插入
INSERT INTO dbo.Person(Id, Name) VALUES (42, "John Doe")
->然后您的CreatedDateTime
Will 自动设置为GETUTCDATE()
值。
不幸的是,如果您已经在EF模型类中映射了此列,那么这是 not 会发生什么。如果您在C#代码中创建Person
的实例,并且CreatedDateTime
列实际上是模型类的一部分,那么EF将使用类似的内容来插入新人:
INSERT INTO dbo.Person(Id, Name, CreatedDateTime) VALUES (42, "John Doe", NULL)
和从现在开始,NULL
是实际上为CreatedDateTime
列提供了,这是将存储的值 - 或者也许是一个空字符串 - 无论如何,无论是什么,指定 columpe/strong>在INSERT
语句中,因此未应用默认约束。。
因此,如果要让SQL Server启动默认值,则需要确保 not 在INSERT
语句中提供有关列。您可以通过:
只有一个单独的模型类仅用于插入,它>不包括所讨论的那些列 - 例如。具有
NewPerson
实体,还映射到Person
表,但仅由Name
和ID
组成。由于这些属性不存在,EF不能也不会与它们生成INSERT
语句 - 因此SQL Server默认约束将启动将
<</em>来处理该过程中的插入。/li>INSERT
方法映射到SQL Server存储的过程中,并通过明确 not 指定要使用默认值
可能是我错的,但我有一个问题。如果您需要将默认日期保存在数据库表中,为什么要从程序级保存另一个日期?我的意思是,创建一个过程和在过程级别上保存日期很容易。类似(选择getDate((...(。
我找到了两个解决方案:
1-此解决方案求解所有具有相同属性的实体,例如 createDateTime
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);
}
}
参考:https://stackoverflow.com/a/5965743/7731479
2-
public partial class Person
{
public Person()
{
this.CreatedDateTime = DateTime.UtcNow;
}
}
引用:创建实体框架模型