Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在插入时忽略实体模型中的特定字段?_.net_Entity Framework - Fatal编程技术网

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

.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

我们的SQL Server数据库表中有一个由SQL Server自动生成的字段,该字段名为
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添加/更新它

  • 如果您无权访问数据库,或者不想在数据库中进行任何更改,则可以更改实体数据模型的行为以自动设置日期。只需扩展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();
        }
    }
    
    然后,您只需更改对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; }
    

    从数据库更新模型后,这种情况还会持续吗?