.net 如何在插入时忽略实体模型中的特定字段?
我们的SQL Server数据库表中有一个由SQL Server自动生成的字段,该字段名为.net 如何在插入时忽略实体模型中的特定字段?,.net,entity-framework,.net,Entity Framework,我们的SQL Server数据库表中有一个由SQL Server自动生成的字段,该字段名为CreatedTime 我们已经将整个数据库表映射到实体框架中的数据模型,因此也映射了字段CreatedTime 因此,当我们通过实体框架在数据库中插入新行时,我们不会为CreatedTime提供任何值 这会导致插入失败,并出现以下错误: SqlDateTime溢出。必须在1753年1月1日12:00:00 AM和9999年12月31日11:59:59 PM之间 所以问题是:是否有一种方法可以在Entity
CreatedTime
我们已经将整个数据库表映射到实体框架中的数据模型,因此也映射了字段CreatedTime
因此,当我们通过实体框架在数据库中插入新行时,我们不会为CreatedTime
提供任何值
这会导致插入失败,并出现以下错误:
SqlDateTime溢出。必须在1753年1月1日12:00:00 AM和9999年12月31日11:59:59 PM之间
所以问题是:是否有一种方法可以在Entity Framework insert语句中排除实体数据模型中的特定字段?这样我们就不会得到上面的错误了
我们希望在实体模型中保留字段CreatedTime
,因为我们可能希望稍后访问它。CreatedTime是否可以为空
一种可能的解决方法-如果CreatedTime不可为空:
DateTime sqlServerMinDateTime = new DateTime(1753, 1, 1, 12, 0, 1, 0);
if(myEntity.CreatedTime < sqlServerMinDateTime)
{
myEntity.CreatedTime = sqlServerMinDateTime;
}
// do insert here
// ....
DateTime sqlServerMinDateTime = new DateTime(1753, 1, 1, 12, 0, 1, 0);
if(myEntity.CreatedTime < sqlServerMinDateTime)
{
myEntity.CreatedTime = null;
}
// do insert here
// ....
DateTime sqlServerMinDateTime=newdatetime(1753,1,1,12,0,1,0);
if(myEntity.CreatedTime
一种可能的解决方法-如果CreatedTime可为空:
DateTime sqlServerMinDateTime = new DateTime(1753, 1, 1, 12, 0, 1, 0);
if(myEntity.CreatedTime < sqlServerMinDateTime)
{
myEntity.CreatedTime = sqlServerMinDateTime;
}
// do insert here
// ....
DateTime sqlServerMinDateTime = new DateTime(1753, 1, 1, 12, 0, 1, 0);
if(myEntity.CreatedTime < sqlServerMinDateTime)
{
myEntity.CreatedTime = null;
}
// do insert here
// ....
DateTime sqlServerMinDateTime=newdatetime(1753,1,1,12,0,1,0);
if(myEntity.CreatedTime
尝试在此属性上使用NotMapped属性
您可以做两件事:
GETDATE()
,并且该字段应该设置正确,您不必通过Entity Framework添加/更新它public partial class MyEntities
{
public override int SaveChanges()
{
var entityChangeSet = ChangeTracker.Entries<SomeEntity>();
if (entityChangeSet != null)
{
foreach (DbEntityEntry<SomeEntity> entry in entityChangeSet )
{
switch (entry.State)
{
case EntityState.Modified:
entry.Entity.LastModifiedDate = DateTime.UtcNow;
break;
case EntityState.Added:
entry.Entity.CreatedDate = DateTime.UtcNow;
break;
}
}
}
return base.SaveChanges();
}
}
然后,您只需更改对ChangeTracker的调用:
var entityChangeSet = ChangeTracker.Entries<IHaveCreatedDate>();
var entityChangeSet=ChangeTracker.Entries();
我找到了解决此线程问题的简单方法:
费尔南多·索托写道:
“如果转到EDM设计器,请单击由数据库自动生成的表中的字段,右键单击该字段,然后选择“属性”和“属性”
看看windows的属性,单击StoreGeneratedPattern并将其值设置为Computed,我相信它将为您提供所需的内容。”
上面的解决方案是超级快速和简单,它似乎工作
同样感谢各位的贡献,但是上面的解决方案似乎可以完成这项工作。如果使用Fluent API:
using System.ComponentModel.DataAnnotations.Schema;
this.Property(t => t.CreatedTime)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
如果使用注释
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public System.DateTime CreatedTime { get; set; }
从数据库更新模型后,这种情况还会持续吗?