通过实体框架模式创建时,不会在 SQL Server 表中设置默认值



我有很多包含默认值的表,例如 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语句中提供有关列。您可以通过:

来执行此操作
  1. 只有一个单独的模型类仅用于插入,它>不包括所讨论的那些列 - 例如。具有NewPerson实体,还映射到Person表,但仅由NameID组成。由于这些属性不存在,EF不能也不会与它们生成INSERT语句 - 因此SQL Server默认约束将启动

  2. INSERT方法映射到SQL Server存储的过程中,并通过明确 not 指定要使用默认值

    <</em>来处理该过程中的插入。/li>

可能是我错的,但我有一个问题。如果您需要将默认日期保存在数据库表中,为什么要从程序级保存另一个日期?我的意思是,创建一个过程和在过程级别上保存日期很容易。类似(选择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;
            }
        }

引用:创建实体框架模型

时忽略db默认值

相关内容

  • 没有找到相关文章

最新更新