我们的SQL Server数据库表中有一个由SQL Server自动生成的字段,该字段名为CreatedTime
。
我们已将整个数据库表映射到Entity Framework中的数据模型,因此也将字段映射到CreatedTime
字段。
当我们通过Entity Framework在数据库中插入新行时,我们不会为CreatedTime
提供任何值。
这会导致插入失败并显示错误:
SqlDateTime溢出。必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间
所以问题是:是否有办法在Entity Framework插入语句中排除Entity数据模型中的特定字段?这样我们就不会得到上述错误了?
我们希望将字段CreatedTime
保留在实体模型中,因为我们可能希望稍后访问它。
答案 0 :(得分:4)
我在这个帖子上找到了一个解决问题的简单方法:
费尔南多·索托写道:“如果你去EDM设计师点击数据库自动生成的表格中的字段,右键单击它并选择属性和 查看属性窗口,单击StoreGeneratedPattern并将其值设置为Computed,我相信它会为您提供所需的内容。“
上述解决方案非常快速简单,似乎有效。
还要感谢您的贡献,但上述解决方案似乎可以胜任。
答案 1 :(得分:3)
如果使用Fluent API:
using System.ComponentModel.DataAnnotations.Schema;
this.Property(t => t.CreatedTime)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
如果使用注释
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public System.DateTime CreatedTime { get; set; }
答案 2 :(得分:1)
尝试在此属性上使用NotMapped属性 http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.schema.notmappedattribute.aspx
答案 3 :(得分:1)
你可以做两件事:
如果您有权访问数据库,请检查该字段是否具有default
值。如果没有,您可以将其设置为GETDATE()
,并且应该正确设置字段,并且您不必通过实体框架添加/更新它。
如果您无权访问数据库,或者不想在其中进行任何更改,则可以更改实体数据模型的行为以自动设置日期。只需扩展您的ObjectContext模型。
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();
}
}
这样,当您添加或更新项目时,您不必为这些字段添加任何信息,模型将为您执行此操作。如果您有多个需要此行为的实体,则可以创建一个接口并使Entity类继承:
public interface IHaveCreatedDate {
DateTime CreatedDate { get; set; }
}
public partial class MyEntity : IHaveCreatedDate {
//MyEntity already implements this!
}
然后您需要做的就是将调用更改为ChangeTracker:
var entityChangeSet = ChangeTracker.Entries<IHaveCreatedDate>();
答案 4 :(得分:0)
CreatedTime 可以为空吗?
一种可能的解决方法 - 如果 CreatedTime 不可为空:
DateTime sqlServerMinDateTime = new DateTime(1753, 1, 1, 12, 0, 1, 0);
if(myEntity.CreatedTime < sqlServerMinDateTime)
{
myEntity.CreatedTime = sqlServerMinDateTime;
}
// do insert here
// ....
一种可能的解决方法 - 如果 CreatedTime 可以为空:
DateTime sqlServerMinDateTime = new DateTime(1753, 1, 1, 12, 0, 1, 0);
if(myEntity.CreatedTime < sqlServerMinDateTime)
{
myEntity.CreatedTime = null;
}
// do insert here
// ....