如何在插入时忽略实体模型中的特定字段?

时间:2013-05-02 14:03:18

标签: .net entity-framework

我们的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保留在实体模型中,因为我们可能希望稍后访问它。

5 个答案:

答案 0 :(得分:4)

我在这个帖子上找到了一个解决问题的简单方法:

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/7db14342-b259-4973-ac09-93e183ae48bb

费尔南多·索托写道:

“如果你去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)

答案 3 :(得分:1)

你可以做两件事:

  1. 如果您有权访问数据库,请检查该字段是否具有default值。如果没有,您可以将其设置为GETDATE(),并且应该正确设置字段,并且您不必通过实体框架添加/更新它。

  2. 如果您无权访问数据库,或者不想在其中进行任何更改,则可以更改实体数据模型的行为以自动设置日期。只需扩展您的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();
        }
    }
    
  3. 这样,当您添加或更新项目时,您不必为这些字段添加任何信息,模型将为您执行此操作。如果您有多个需要此行为的实体,则可以创建一个接口并使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
// ....