EF - 代码优先 - SQL 默认值 getdate() 给出错误

Posted

技术标签:

【中文标题】EF - 代码优先 - SQL 默认值 getdate() 给出错误【英文标题】:EF - Code First - SQL Default Value getdate() gives error 【发布时间】:2011-06-24 13:56:35 【问题描述】:

我有一个包含日期时间列的 Priority 类。该列在SQL中有一个默认值(EF生成数据库和表后,我将CreatedDate的默认值更改为getdate())。所以我只想插入优先级的其他列,但 EF 不允许我并给出此错误:

System.InvalidOperationException:支持“ToDoModel”上下文的模型自数据库创建以来已更改。手动删除/更新数据库,或使用 IDatabaseInitializer 实例调用 Database.SetInitializer。例如,RecreateDatabaseIfModelChanges 策略将自动删除并重新创建数据库,并可选择为其添加新数据。

public class Priority


    public int ID  get; set;         
    public string Name  get; set; 
    public string Color  get; set; 
    public string Image  get; set;        
    public DateTime CreatedDate  get; set; 



public class ToDoModel:DbContext


    public  ToDoModel() : base("ToDoList.ConnectionString")            
    

    public DbSet<Priority> Priorites  get; set;    

    protected override void OnModelCreating(ModelBuilder modelBuilder)
               

        modelBuilder.Entity<Priority>().MapSingleType().ToTable("tblPriority");
        modelBuilder.Entity<Priority>().HasKey(x => x.ID); 
        modelBuilder.Entity<Priority>().Property(x => x.CreatedDate).StoreGeneratedPattern = StoreGeneratedPattern.Computed;

         base.OnModelCreating(modelBuilder);
    




 [TestMethod]
    public void CanAddPriority()
    
        var priority = new Priority();
        priority.Color = "red";
        priority.Image = "critical.jpg";
        priority.Name = "Critical";
        db.Priorites.Add(priority);           
        db.SaveChanges();
        Assert.IsTrue(priority.ID > 0);

    

【问题讨论】:

【参考方案1】:

这是一个有用的链接,用于说明在模型更改时如何删除和重新创建数据库。 http://davidhayden.com/blog/dave/archive/2011/04/27/DatabaseInitializersEFCodeFirstDatabaseSetInitializer.aspx

这里有一个类似的,也许有帮助的问题和答案,关于 SO...HTH How to manage GetDate() with Entity Framework

【讨论】:

我使用了 Database.SetInitializer(new RecreateDatabaseIfModelChanges()); 。我有这样的错误。 System.NotSupportedException:不属于“timestamp”或“rowversion”类型的属性不支持商店生成的模式“Computed”。我无法手动更改默认值,EF 也没有设置默认值 :( @whitestream - 我用新链接更新了答案,希望对您有所帮助! 我正在使用不支持datetime2 类型的SQL Server 2005。我不明白为什么 EF 会这样做,因为我将 StoreGeneratedPattern 设置为 Computed【参考方案2】:

OnModelCreating 方法中,我将modelBuilder.IncludeMetadataInDatabase 设置为false,现在一切正常。

 protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        modelBuilder.Entity<Priority>().MapSingleType().ToTable("tblPriority");
        modelBuilder.Entity<Priority>().HasKey(x => x.ID);
        modelBuilder.Entity<Priority>().Property(x => x.CreatedDate).StoreGeneratedPattern = System.Data.Metadata.Edm.StoreGeneratedPattern.Computed;
        modelBuilder.IncludeMetadataInDatabase = false;
        base.OnModelCreating(modelBuilder);
    

【讨论】:

以上是关于EF - 代码优先 - SQL 默认值 getdate() 给出错误的主要内容,如果未能解决你的问题,请参考以下文章

EF6 使用列默认值创建代码优先表

代码优先迁移中列的 EF6 Oracle 默认值

EF 6.X 中的实体框架代码优先 Fluent API 默认值

由EF代码优先决定SQL Azure数据库版本和大小的因素?

代码优先迁移:如何为新属性设置默认值?

ASP.NET 5 EF7 代码优先迁移默认按字母顺序创建列